java - 查找 2 个 csv 文件差异的有效方法

标签 java csv awk

我有 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/

相关文章:

java - JSF : Passing data between 2 views

python - Pandas read_csv 无法正确加载逗号分隔的 CSV

python - 按年份过滤行;具有类似日期时间值的 AttributeError : Can only use . dt 访问器

regex - 替换大文件中带引号的字符串中的换行符

variables - 删除awk中的一个变量

java - 无法从 jsqlparser 库导入包

java - 在 opencv for android 中使用运动分析和对象跟踪进行瞳孔运动

java - Spring @Async 和 java CompleteFuture 提供异步 : call bean inside asynchronous method

batch-file - 如何从逗号分隔文件中删除前导零

html - awk 多行非贪婪匹配解决方法