假设 A、B 两个文件,按行比,显示 A 比 B 多的行、B 比 A 多的行、A 与 B 都存在但是不一致的行。 类似于实现 Beyond Compare 的功能。
1
TimePPT 2019-12-11 10:40:02 +08:00
既然是 python 节点的话,试试 python 标准库 difflib ?
https://docs.python.org/zh-cn/3.7/library/difflib.html |
2
Vegetable 2019-12-11 10:46:04 +08:00
这也太笼统了,你这个需求也许 git diff 就能满足,"A 与 B 都存在但是不一致的行"是说位置不同吗?
简单来说,因为你的最小对比单位是行,所以你可以直接计算单行的 md5,为两个文件建立{hash:line_no}的字典,进行后续处理. |
3
haozxuan001 2019-12-11 10:46:15 +08:00
linux 有一个 comm 可以了解一下,不同的参数可以对比出不同的差异,比如 A 有 B 无,A 无 B 有,当然需要注意一句这两个大文件需要先排序一下
|
4
leafin 2019-12-11 10:47:34 +08:00 1
“A 与 B 都存在但是不一致的行”这一句话怎么定义?
|
5
SoulMelody 2019-12-11 10:51:34 +08:00
|
6
yeyu1989 OP 追加问题描述:
大文件有多大:可达 G 级别 文件格式:多为每行定长的 txt 文件,按列定义不同的字段。之前有考虑过,先将 txt 转为 csv 文件,定义主键,再比对,但是这样对存储、内存消耗都特别大,并且有的文件定义主键后建不了索引,也无法完成比对 Beyond Compare 在定义 A 有 B 无、A 无 B 有、AB 不一致时,貌似是按照相似度来处理的?这个第一没有主键说明,确实不好定义。 以上。 @Vegetable @haozxuan001 @leafin @TimePPT 多谢,我去学习下,看看行不行 |
7
gwy15 2019-12-11 11:02:10 +08:00
看看 Myers 算法
|
8
haozxuan001 2019-12-11 11:07:08 +08:00
@yeyu1989 我之前做过 M 级别的,个人认为如果达到 G 的级别,一定是先排序后对比,这样才能不爆内存的情况下,“一块块”的对比出来,另外你的 AB 不一致相似度这种就玄学了,一样就是一样,不一样错一个字符都不一样,如果这是一个强需求,可能我上述的方案就合适了,如果是弱需求,可以先找出两个文件的差异行。
|
9
richzhu 2019-12-11 11:09:09 +08:00
vimdiff fileA fileB
|
10
614457662 2019-12-11 12:13:21 +08:00 via Android
先 sort 再 diff
|