You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java CSV文件对比代码无法正确统计相同行问题排查

解决CSV文件对比时相同行计数错误的问题

我一眼就看出问题所在啦!你的代码里Scanner s 在第一次遍历完file1之后,就没办法再从头读取文件内容了,这才导致相同行的计数器j只返回1。

问题根源详解

当你执行第一次外层循环(遍历file2的行)时,内层的while(s.hasNextLine())会把file1的所有行一次性读完,此时Scanner s的指针已经停在了文件末尾。后续每次外层循环再进入内层时,s.hasNextLine()都会返回false,内层循环直接跳过,自然只有第一行可能被匹配到,j也就只能增加一次。

修复后的代码方案

更高效的做法是先把file1的所有行加载到一个HashSet集合里(查找效率极高),然后遍历file2的每一行,检查是否存在于这个集合中。这样既解决了指针无法重置的问题,还能提升对比效率:

import java.io.File;
import java.io.IOException;
import java.util.HashSet;
import java.util.Scanner;

public class CompareCSV {
    public static void main(String[] args) throws IOException {
        int matchingLinesCount = 0;
        int file2LineCount = 0;
        
        // 先把file1的所有行加载到HashSet中
        HashSet<String> file1Lines = new HashSet<>();
        try (Scanner file1Scanner = new Scanner(new File("src/hurtownie/file1.csv"))) {
            while (file1Scanner.hasNextLine()) {
                file1Lines.add(file1Scanner.nextLine().trim()); // 可以加trim()处理可能的空格
            }
        }
        
        // 遍历file2,统计行数和匹配数
        try (Scanner file2Scanner = new Scanner(new File("src/hurtownie/file2.csv"))) {
            while (file2Scanner.hasNextLine()) {
                file2LineCount++;
                String line = file2Scanner.nextLine().trim();
                if (file1Lines.contains(line)) {
                    matchingLinesCount++;
                }
            }
        }
        
        System.out.println("file2的行数:" + file2LineCount);
        System.out.println("相同行的数量:" + matchingLinesCount);
    }
}

额外优化点说明

  • 使用try-with-resources语法,不需要手动关闭Scanner,JVM会自动处理,避免资源泄漏。
  • 加入trim()方法可以忽略每行首尾的空格,避免因为空格导致的误判(如果你的CSV行没有多余空格,可以去掉)。
  • 变量名改成了更有意义的名字,代码可读性更好。

内容的提问来源于stack exchange,提问作者damlit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:41:02