比较2个CSV文件的代码没有相似之处

时间:2019-03-30 10:09:36

标签: java csv compare java.util.scanner

用于比较2个CSV文件的代码:

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

public class compareCSV {
    public static void main(String[] args) throws IOException {
        int j = 0;
        int countLinesInW = 0;
        Scanner s = new Scanner(new File("src/hurtownie/file1.csv"));
        Scanner w = new Scanner(new File("src/hurtownie/file2.csv"));
        while (w.hasNextLine()) {
            String lineW = w.nextLine();
            countLinesInW++;
        while(s.hasNextLine()) {
            String lineS = s.nextLine();
            if(lineS.equals(lineW)){
                j++;
            }
        }
        }
        System.out.println(countLinesInW);
        System.out.println(j);
    }
}

在file1中,我有一列包含3000行。 在file2中,我有一列包含1000行。 countLinesInW仅与行相反并且可以正常工作。 j计数器存在问题。它应该检查相同行的数量,但是不正确。 j返回“ 1”,但我知道它太低了(预期结果〜700)。

2 个答案:

答案 0 :(得分:0)

在代码中

while (w.hasNextLine()) {
    String lineW = w.nextLine();
    countLinesInW++;
    while(s.hasNextLine()) {
        String lineS = s.nextLine();
        if(lineS.equals(lineW)){
            j++;
        }
    }
}

s.hasNextLine()在扫描器w一次读取完整个文件之后始终为false。

您的目的是从两个csv文件中获取相似行的数量,建议您阅读所有行并将其首先保存在两个列表中,然后将两者进行比较 列表以获取相似行的数量。像

List<String> linesInFile1 = new ArrayList<>();
List<String> linesInFile2 = new ArrayList<>();
while (w.hasNextLine()) {
    String lineW = w.nextLine();
    linesInFile1.add(lineW);
}
while(s.hasNextLine()) {
    String lineS = s.nextLine();
    linesInFile2.add(lineS);
}

linesInFile1.retainAll(linesInFile2);
j = linesInFile1.size();

请注意,retainAll方法将保留两个列表中的公用项。

答案 1 :(得分:0)

不需要直接循环,并且可以根据需要指定字符集:

List<String> linesInFile1 = Files.readAllLines(new File("file1.csv").toPath(), Charset.defaultCharset() );
List<String> linesInFile2 = Files.readAllLines(new File("file2.csv").toPath(), Charset.defaultCharset() );

linesInFile1.retainAll(linesInFile2);