比较Java中的两个csv文件
我们需要比较两个CSV文件。假设第一个文件有几行,第二个文件可以有相同的行数或更多行数。两个文件上的大多数行可以保持相同。正在寻找在这两个文件之间进行差异的最佳方法,并仅读取第二个文件中与第一个文件中存在差异的行。处理该文件的应用程序是Java
最好的方法是什么
注意:如果我们能知道第二个文件中有一行被更新、插入或删除,那就太好了
要求:-
- 不会有任何重复记录
- 文件1和文件2可能有相同数量的记录,其中有几行在文件2中具有更新的值(记录已更新)
- 文件2可能删除了几行(这被视为记录已删除)
- 文件2可能添加了一些新行(这被视为插入了记录)
- 列的上一个可以被视为记录的主键,这在两个文件中都不会更改李>
# 1 楼答案
读取整个第一个文件,并将其放入
List
。然后一次读取一行第二个文件,并将每一行与第一个文件的所有行进行比较,以查看它是否重复。如果它不是重复的,那么它是新的信息。如果您在阅读方面遇到困难,请查看http://opencsv.sourceforge.net/,它是一个非常好的Java CSV文件阅读库# 2 楼答案
一种方法是使用java的^{} 接口;将每行作为字符串读取,将其添加到集合中,然后对第一个集合上的第二个集合执行^{} ,从而保留不同的行。当然,这是假设文件中没有重复的行
更新
好的,你有一个PK字段。我假设你知道如何从你的字符串中得到它;使用openCSV或regex或任何你想要的东西。制作一个实际的
HashMap
而不是上面的HashSet
,使用PK作为键,行作为值# 3 楼答案
有一个比较/减去两个CSV文件的程序。它使用ArrayList
# 4 楼答案
您提到检测“更新”行。我猜这意味着一行在某种程度上有一个身份,可以在更新后生存。可能是单个列或复合列提供标识。这是您个人需要整理和实现的实现细节,它只会为您的解决方案添加更多代码
无论如何。。。数据库往往能够很好地支持使用集合数据和从csv文件加载数据。所有大型关系数据库都提供了强大的支持,并提供了将csv文件中的数据加载到表中的简单语法。此时,在两个表之间查找新行或修改行是非常简单的sql查询
这显然不是一个纯java解决方案,但我认为值得一提
# 5 楼答案
尝试使用java-diff-utils库
范例
我使用groovy快速演示java库:
两个示例文件之间报告了以下差异:
文件1。csv
文件2。csv
微分槽
更新
根据dbunit FAQ的说法,对于非常大的数据集,可以通过使用ResultSetTableFactory接口的流式修订来改进此解决方案的性能。这在ANT任务中启用,如下所示:
# 6 楼答案
如果您想要比较存储在字符串变量中的两个csv响应(如果您通过REST调用获得它们),我的简单解决方案是。在我的例子中,我想在10行不同的阈值之后退出检查