我有 2 个大的(比如 300,000 * 100)矩形 csv 文件,它们具有相同数量的对应行和列。我需要找出 2 个文件中每个对应单元格之间的差异(如果有的话)。 程序应该输出不同的行号和单元格号以及不同的内容。
由于行数/列数非常大,我正在寻找最有效的方法。
最初我开始探索 awk 和 this看起来很有前途,但我之前没有使用过 awk,并且未能成功将其扩展到 100 列而不是示例中的 2 列
接下来,我尝试了一种使用 Java 的蛮力方法 - 将文件加载到 2 个二维数组中。初始化 100 个线程,每个线程处理给定的列,当发现差异时,每个线程将行、单元格和差异值放入 HashMap(以列号为键)。我确实尝试通过比较来优化它,同时将第二个文件读入数组,但实际上因为我正在访问每个单元格,所以它不可能很快(花了将近 8 个小时来完成比较)
我可以使用 awk 或 Java。并对任何其他完全不同的方法持开放态度。
最佳答案
awk
助您一臂之力!
在 awk
中执行此操作很简单
$ paste -d, file.1 file.2 |
awk -F, '{m=NF/2; for(i=1;i<=m;i++) if($i!=$(i+m)) print NR,i,$i,$(i+m)}'
打印不相等单元格的“row# column# left right”值。
如果除了行号还想打印一个键列,可以轻松添加
$ paste -d, file.1 file.2 |
awk -F, -v key=8 '{m=NF/2;
for(i=1;i<=m;i++)
if($i!=$(i+m)) print $key,NR,i,$i,$(i+m)}'
关于java - 查找 2 个 csv 文件差异的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40195907/