繁体   English   中英

文件比较的逻辑

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM