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
相关产品推荐
相关产品推荐

