我有两个或更多.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
对于你们中的一些人可能会想:“。”在标题中只是.csv文件中的附加信息,不应被视为分隔符(“。”是将json文件转换为csv,尊重json数据的级别)。 我的问题是到目前为止我没有找到任何接受不同列数的解决方案。 有没有一个很好的方法来实现这一目标?到目前为止我没有代码,但我认为以下内容可行:
HashMap<Integer,String> //Integer = lineNumber, String = data
,以便每个文件都有自己的HashMap 为什么我认为这个想法不太好:
我认为如果我做了建议的事情,可能会导致这种情况:
//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.
有没有方便的方法我可以合并两个或多个文件的数据而不用(!)知道标题包含多少元素?
答案 0 :(得分:2)
这不是唯一的答案,但希望它可以指出你的方向。 合并很难 ,你必须给它一些规则,你需要决定这些规则是什么。通常你可以将它分解为少数标准,然后从那里开始。
我写了一个&#34;数据库&#34;一段时间来处理这样的情况:
https://github.com/danielbchapman/groups
基本上只是一个Map<Integer, Map<Integer. Map<String, String>>>
并不是那么复杂。我建议您将每行读入类似于以下的结构:
(Set One) -> Map<Column, Data>
(Set Two) -> Map<Column, Data>
Bidi地图(如评论中所示)将使您的查找更快,但如果您有重复值,则会有一些陷阱。
一旦拥有了这些结构,您就可以轻松查找:
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处理,地图是我最好的朋友。