【问题标题】:Logic for a file compare文件比较的逻辑
【发布时间】:2009-11-12 12:43:43
【问题描述】:

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

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

【问题讨论】:

    标签: algorithm file comparison


    【解决方案1】:

    我想知道Levenshtein Distance 在这种情况下是否会帮助您。它会让您知道这两个文件有多相似,但我不知道您是否可以将 @ 归零。值得一看的东西。

    【讨论】:

      【解决方案2】:

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

      • 用那个替换这个块
      • 插入一个块
      • 删除区块
      • 复制一个块(称为“相等”)

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

      【讨论】:

        【解决方案3】:

        我相信您正在寻找的是两个字符串之间的距离,也许this 可以帮助您。

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            【解决方案5】:

            有点过时了,我想 :) 但我看到这篇文章是因为我正在寻求解决同一问题的帮助:我有两个并排显示的文件,我必须标记那些没有的行'不匹配红色。

            不过,我的情况有点特殊,因为 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中是否有对应的行。如果是这样,请删除两者。剩下的只是差异,您可以轻松地在原始文本中标记这些行。

            非常简单,不包括库。就我的两分钱...

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-07-16
              • 2010-12-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多