java - 合并两个具有不同标题的csv文件

标签 java csv

我需要根据各自的部分合并两个具有相似标题但数据不同的 CSV 文件中的数据。 CSV 文件将包含两部分,第一部分包含按部门划分的数据,第二部分包含住宅区的数据。这是我的第一个 CSV 文件

Sector,Total Number of Occurrence 
sector1,12
sector2,30
sector3,100

House,Total Number of Occurrence  
B12,80
A2,87


我的第二个 CSV 文件

Sector,Total Number of Occurrence 
sector 99,89
sector 11,9

House,Total Number of Occurrence 
Q11,22
Q22,67

我希望生成一个包含这两种数据的 CSV 文件,但数据必须分配到正确的部分,如下所示

Sector,Total Number of Occurrence 
sector1,12
sector2,30
sector3,100
sector 99,89
sector 11,9    

House,Total Number of Occurrence  
B12,80
A2,87
Q11,22
Q22,67


但我想用我当前开发的源代码,它无法做到这一点,因为它包含 CSV 中列出的第二个 header ,即 House,Total Number of Occurrence。我可以知道如何达到我想要的输出吗?这就是我当前的 csv 输出的样子

Sector,Total Number of Occurrence 
sector1,12
sector2,30
sector3,100

House,Total Number of Occurrence  
B12,80
A2,87
sector 99,89
sector 11,9

House,Total Number of Occurrence  
B12,80
A2,87 


这是我目前开发的源码

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class SummarizeReport1
{
   static ArrayList<String> list1 = new ArrayList<>();
   static String line1;
   public static void main(String[] args) throws IOException 
   {
        List<Path> paths = Arrays.asList(Paths.get("C:\\Users\\user\\Desktop\\file\\log\\backup\\report12017-10-31.csv"), Paths.get("C:\\Users\\user\\Desktop\\file\\log\\backup\\report12017-10-31 - Copy.csv"));
        List<String> mergedLines = getMergedLines(paths);
        Path target = Paths.get("C:\\Users\\user\\Desktop\\file\\log\\backup\\SummarizedReport1.csv");
        Files.write(target, mergedLines, Charset.forName("UTF-8"));
    }

    private static List<String> getMergedLines(List<Path> paths) throws IOException 
    {
        List<String> mergedLines = new ArrayList<> ();
        for (Path p : paths)
        {
            List<String> lines = Files.readAllLines(p, Charset.forName("UTF-8"));
            if (!lines.isEmpty()) {
                if (mergedLines.isEmpty()) {
                    mergedLines.add(lines.get(0)); //add header only once
                }
                mergedLines.addAll(lines.subList(1, lines.size()));
            }
        }
        return mergedLines;
    }   
}

最佳答案

首先,创建一个类来存储标题和每一行。

public class SubFile{
    private String headers;
    private List<String> lines
}

然后,逐行读取文件。 对于第一行,只需创建一个带有 header 的新 SubFile 实例。接下来的每一行,将它们添加到此实例中 (addLine)。

您需要存储多个“子”csv,因此使用Collection,在这里,我将使用List,因为为什么不......

List<SubFile> files;

每次读取 header (第一行或空行之后)时,您都需要检查该 header 是否与 Collection 中的实例匹配以继续添加到其中,或者创建一个实例.

public SubFile getInstance(String headerLine){
     /*
     instance = search instance in collection 
     if (instance not found)
         create instance
         add it to the list
     return instance
     */
}

我相信这实现起来非常简单,所以我会让你先尝试一下,你有可以使用的算法。

关于java - 合并两个具有不同标题的csv文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46888265/

相关文章:

mysql - 如何将 MySQL 的查询结果以格式化的 CSV 格式导出到标准输出?

python - 如何向包含特定值的行添加新列?

javascript - 带有 Express 的 Node.js - 返回指向 .CSV 文件的链接而不是下载它

parsing - 上传 CSV 文件并将数据解析到 Grails 中的数组?

禁用深度测试时,Java OpenGL 颜色 Material 变暗

java - 在 Java 中将具有不同布局的文件导入数据库

java - 如何使用Java将字符串和二进制文字发送到服务器

java - 通过绑定(bind)的前台服务保持音频播放

java - 向 JavaFX ToggleSwitch 添加更改监听器

css - CSV 数据以列格式显示?