如何比较两个大的文本文件内容的差异

2019-12-11 10:37:18 +08:00
 yeyu1989

假设 A、B 两个文件,按行比,显示 A 比 B 多的行、B 比 A 多的行、A 与 B 都存在但是不一致的行。 类似于实现 Beyond Compare 的功能。

6487 次点击
所在节点    Python
12 条回复
TimePPT
2019-12-11 10:40:02 +08:00
既然是 python 节点的话,试试 python 标准库 difflib ?
https://docs.python.org/zh-cn/3.7/library/difflib.html
Vegetable
2019-12-11 10:46:04 +08:00
这也太笼统了,你这个需求也许 git diff 就能满足,"A 与 B 都存在但是不一致的行"是说位置不同吗?
简单来说,因为你的最小对比单位是行,所以你可以直接计算单行的 md5,为两个文件建立{hash:line_no}的字典,进行后续处理.
haozxuan001
2019-12-11 10:46:15 +08:00
linux 有一个 comm 可以了解一下,不同的参数可以对比出不同的差异,比如 A 有 B 无,A 无 B 有,当然需要注意一句这两个大文件需要先排序一下
leafin
2019-12-11 10:47:34 +08:00
“A 与 B 都存在但是不一致的行”这一句话怎么定义?
SoulMelody
2019-12-11 10:51:34 +08:00
yeyu1989
2019-12-11 11:00:04 +08:00
追加问题描述:
大文件有多大:可达 G 级别
文件格式:多为每行定长的 txt 文件,按列定义不同的字段。之前有考虑过,先将 txt 转为 csv 文件,定义主键,再比对,但是这样对存储、内存消耗都特别大,并且有的文件定义主键后建不了索引,也无法完成比对

Beyond Compare 在定义 A 有 B 无、A 无 B 有、AB 不一致时,貌似是按照相似度来处理的?这个第一没有主键说明,确实不好定义。

以上。
@Vegetable @haozxuan001 @leafin
@TimePPT 多谢,我去学习下,看看行不行
gwy15
2019-12-11 11:02:10 +08:00
看看 Myers 算法
haozxuan001
2019-12-11 11:07:08 +08:00
@yeyu1989 我之前做过 M 级别的,个人认为如果达到 G 的级别,一定是先排序后对比,这样才能不爆内存的情况下,“一块块”的对比出来,另外你的 AB 不一致相似度这种就玄学了,一样就是一样,不一样错一个字符都不一样,如果这是一个强需求,可能我上述的方案就合适了,如果是弱需求,可以先找出两个文件的差异行。
richzhu
2019-12-11 11:09:09 +08:00
vimdiff fileA fileB
614457662
2019-12-11 12:13:21 +08:00
先 sort 再 diff
hxse
2019-12-12 13:28:38 +08:00
@yeyu1989 标准库 difflib 能解决你的需求吗
yeyu1989
2019-12-12 13:38:13 +08:00
@hxse 还没有试 ///直觉不行,效率可能跟不上

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/627878

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX