文件比较的逻辑

时间:2009-11-12 12:43:43

标签: algorithm file comparison

我正在尝试编写一个用于文件比较的程序。例如:

文件1

1
2
3
4
5

file2的

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等。

5 个答案:

答案 0 :(得分:2)

我想知道Levenshtein Distance在这种情况下是否会帮助你。它会告诉你两个文件有多相似,但我不知道你是否可以归零@。还有待观察的东西。

答案 1 :(得分:1)

我相信你要找的是2个字符串之间的距离,也许this可以帮助你。

答案 2 :(得分:1)

Python有一个非常方便的库,用于比较名为difflib的序列。底层的SequenceMatcher类接受两个python序列,并为您提供一系列操作码,告诉您如何从第一个序列到第二个序列(即差异)。它们的形式如下:

  • 将此块替换为该块
  • 插入一个块
  • 删除一个块
  • 复制一个块(称为“相等”)

这些参考块通过将索引提供给原始序列。这可以应用于文件中的行或字符串中的字符或其他任何可以在python中变成序列的内容。

答案 3 :(得分:1)

如果您不是在编写程序来学习差异算法,而只是寻找解决方案,那么您应该尝试diff-match-patch。它包含不同编程语言中的diff和patch算法的实现(cpp,c#,java,javascript,python)。

我尝试了它的java版本,它就像一个魅力。

答案 4 :(得分:1)

有点过时了,我想:)但是我遇到了这个帖子,因为我正在寻找相同问题的帮助:我有两个文件,我并排显示,我必须标记出来的线条红色匹配。

我的有点特殊情况,因为1)订单并不重要,2)每行保证只发生一次(文本是带有定义的许可文件,逐行)。 / p>

事实证明,最简单的方法就是制作两个文件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中是否有对应的行。如果是,请删除两者。您剩下的只是差异,您可以轻松地在原始文本中标记这些行。

非常简单,不包含任何库。只是我的两分钱......