我有两个或多个 .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/