java - 在 Java 中合并 CSV 文件与动态 header

标签 java csv

我有两个或多个 .csv 文件,其中包含以下数据:

//CSV#1
Actor.id, Actor.DisplayName, Published, Target.id, Target.ObjectType
1, Test, 2014-04-03, 2, page

//CSV#2
Actor.id, Actor.DisplayName, Published, Object.id
2, Testing, 2014-04-04, 3

所需的输出文件:

//CSV#Output
Actor.id, Actor.DisplayName, Published, Target.id, Target.ObjectType, Object.id
1, Test, 2014-04-03, 2, page, 
2, Testing, 2014-04-04, , , 3

对于某些人可能想知道的情况:“.” header 中的 仅仅是 .csv 文件中的附加信息,不应被视为分隔符(“.”是 json 文件转换为 csv 的结果,尊重 json 数据的级别)。 我的问题是,到目前为止我还没有找到任何接受不同列数的解决方案。 有没有一个好的方法来实现这一目标?到目前为止我还没有代码,但我认为以下内容可以工作:

  • 读取两个或多个文件并将每一行添加到 HashMap<Integer,String> //Integer = lineNumber, String = data ,这样每个文件都有自己的HashMap
  • 迭代所有索引并将数据添加到新的 HashMap。

为什么我认为这个想法不太好:

  • 如果文件 1 中的标题和行数据与文件 2(等)不同,则顺序将无法保持正确。

我认为如果我执行建议的操作,可能会出现以下结果:

//CSV#Suggested
Actor.id, Actor.DisplayName, Published, Target.id, Target.ObjectType, Object.id
1, Test, 2014-04-03, 2, page //wrong, because one "," is missing
2, Testing, 2014-04-04, 3 // wrong, because the 3 does not belong to Target.id. Furthermore the empty values won't be considered.

是否有一种方便的方法可以合并两个或多个文件的数据,而无需(!)知道 header 包含多少个元素?

最佳答案

这不是唯一的答案,但希望它能为您指明一个好的方向。 合并很难,你必须给它一些规则,并且你需要决定这些规则是什么。通常您可以将其分解为几个标准,然后从那里开始。

不久前我写了一个“数据库”来处理这样的情况:

https://github.com/danielbchapman/groups

它基本上只是一个 Map<Integer, Map<Integer. Map<String, String>>>这并不那么复杂。我建议您将每一行读入类似于以下的结构:

(Set One) -> Map<Column, Data>
(Set Two) -> Map<Column, Data>

Bidi map (如评论中建议的那样)将使您的查找速度更快,但如果您有重复的值,则会带来一些陷阱。

一旦有了这些结构,您的查找就可以像下面这样简单:

 public List<Data> process(Data one, Data two) //pseudo code
  {
     List<Data> result = new List<>();
     for(Row row : one)
     {
       Id id = row.getId();
       Row additional = two.lookup(id);
       if(additional != null)
         merge(row, additional);

       result.add(row);
     }
  }

  public void merge(Row a, Row b)
  {
    //Your logic here.... either mutating or returning a copy.
  }

在此解决方案中,我无需担心列,因为这仅作用于原始数据类型。您可以轻松地重新映射所有列名称,方法是在每次查找时存储它们或在输出时重新创建它们。

我链接我的项目的原因是我很确定其中有一些方法(例如输出列名称等...),它们可能会节省您大量的时间/为您指明正确的方向。

我在工作中进行了大量的 TSV 处理, map 是我最好的 friend 。

关于java - 在 Java 中合并 CSV 文件与动态 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27506177/

相关文章:

java - LibGDX - 创建动画

java - 从 csv 文件打印特定行

Powershell 格式表转 CSV

php - 排序/解析 MySQL 行字段中的异构 CSV 分隔文本值

python - 从 CSV 导入时的 Numpy 数组

Python csv : preserve headers when writing to file

Java - 在 Windows 7 中通过命令行获取外部进程的 PID

java - 当有行跨度时,flextable 会被点击列

javascript - p 命令按钮操作不会触发,但 oncomplete 会触发

java - 如何在 Java 中使用 Axon Framework 区分空响应和超时