[英]Logic for a file compare
我试着编写一个用于文件比较的程序。 例如:
文件1
1
2
3
4
5
文件2
1
2
@
3
4
5
如果我逐行进行,我得到:
1 == 1;
2 == 2;
3 != @;
4 != 3;
5 != 4;
!= 5;
但是,事实是文件之间的唯一区别是@。 我希望得到这样的东西:
1 == 1;
2 == 2;
!= @;
3 == 3;
4 == 4;
5 == 5;
这是最好的方法吗? 不使用任何外部应用程序,如diff,fc等。
我想知道Levenshtein Distance是否会在这种情况下帮助你。 它会告诉你两个文件有多相似,但我不知道你是否可以归零@。 无论如何要看的东西。
我相信你要找的是2弦之间的距离,也许这可以帮到你。
Python有一个非常方便的库来比较名为difflib的序列。 底层的SequenceMatcher类接受两个python序列,并为您提供一系列操作码,告诉您如何从第一个序列到第二个序列(即差异)。 这些是以下形式:
这些参考块通过将索引提供给原始序列。 这可以应用于文件中的行或字符串中的字符或其他任何可以在python中变成序列的内容。
如果你不是在编写程序来学习差异算法,而只是寻找解决方案,你应该尝试diff-match-patch 。 它包含不同编程语言(cpp,c#,java,javascript,python)中的diff和patch算法的实现。
我尝试了它的java版本,它就像一个魅力。
有点过时了,我想:)但是我遇到了这个帖子,因为我正在寻找相同问题的帮助:我有两个文件,我并排显示,我必须标记不匹配的行红色的。
然而,我的有点特殊情况,因为1)订单并不重要,2)每行保证只发生一次(文本是带有定义的许可文件,逐行)。
事实证明,最简单的方法就是制作两个文件ls1和ls2的列表,并执行以下操作(伪代码):
i = 0;
while (i < ls1.count) {
n = ls2.find(ls1[i]);
if (n >= 0) {
// found match in ls2
ls1.Delete(i);
ls2.Delete(n);
} else
i++;
}
解释一下,对于每一行是ls1,看看ls2中是否有对应的行。 如果是,请删除两者。 您剩下的只是差异,您可以轻松地在原始文本中标记这些行。
非常简单,不包含任何库。 只是我的两分钱......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.