如何将多个csv文件合并到具有单个标头的单个csv文件中,还会删除基于特定列的重复项

时间:2017-03-18 08:17:17

标签: java csv merge duplicates zip

我在一个目录中有超过100个csv文件,它们具有相同的列名,我想将它们合并到一个单独的csv文件中,如何在java中执行此操作。 我编写了一个程序,它将从目录中的多个zip文件夹中提取所有csv文件,现在我想将这些多个csv文件合并到一个带有单个标头的csv文件中。 如果有任何基于某些列的比较,我想删除它们中的重复项。

例如:

CSV1:

Id名称编号 1 Raj 1234 2 Ramesh 2345 3 Jayesh 3467

CSV2:

Id名称编号 1 Ganesh 4756 2 Suresh 7575 3 Jayesh 9999

与此类似,我有100个csv文件,我想将它与单个标题组合成单个csv 像这样:

身份证号码号码 1 Raj 1234 2 Ramesh 4321 3 Jayesh 4567 1 Ganesh 4756 2 Suresh 7575

我们可以看到 jayesh 只出现一次,因为他在两个csv文件中都有条目。 (这里我使用名称进行比较) 这只是一个只有3列的例子,但在我真正的csv中我有20多列。

我如何在Java程序中执行此操作?

1 个答案:

答案 0 :(得分:1)

我不明白为什么你的数据在同一条线上:" Id名称编号1 Raj 1234 2 Ramesh 2345 3 Jayesh 3467"并没有每行记录。然后,你说它是CSV。 CSV是逗号分隔值。所以我希望你的专栏用",#34;分开。所以我会认为你的数据实际上是这样的:

Id,Name,Number
1,Raj,1234
2,Ramesh,2345
3,Jayesh,3467

我会认为你没有在你的问题中做出陈述。

此外,我不明白你想对具有相同id的行的值做什么。你说你不想要重复,但你没有解释如何处理重复的值(保留第一个值,连接,如果它是一个整数,则添加......)。我们要考虑保持与第一行相关联的值。

所以你可以这样做:

public static void main(String[] args) throws IOException {
    File inputFolder = new File("yourFolderPath");
    Set<String> alreadyMetNames = new HashSet<>();
    File output = File.createTempFile("output", ".csv");
    try (FileWriter fw = new FileWriter(output); BufferedWriter bw = new BufferedWriter(fw)) {
        bw.write("Id,Name,Number");
        bw.newLine();
        for (File file : inputFolder.listFiles()) {
            try (FileReader fr = new FileReader(file); BufferedReader br = new BufferedReader(fr)) {
                String line;

                // Search the header line
                while ((line = br.readLine()) != null) {
                    if (line.startsWith("Id")) break;
                }

                // Start to parse the file at the first row containing data
                while ((line = br.readLine()) != null) {
                    String[] split = line.split(",");
                    if (alreadyMetNames.add(split[1])) {// If the name has not already been met
                        bw.write(line);
                        bw.newLine();
                    }
                }
            }
        }
    }
    System.out.println("Your file is here : " + output.getAbsolutePath());
}

这段代码为您的新文件创建一个编写器,用于连接其他文件的内容。然后它迭代你拥有的每个文件,搜索标题行,最后将标题行下面的数据内容写入最终输出文件。在编写行时,它会处理不会重写已满足的id的行。