2009-11-12 111 views
4

我试图编写文件比较的程序。例如:文件比较的逻辑

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

+0

了解和while – 2009-11-12 12:47:10

回答

1

Python有一个名为difflib序列比较一个非常方便的图书馆。底层的SequenceMatcher类有两个python序列,并给你(除其他外)一系列操作码,告诉你如何从第一个序列到第二个序列(即差异)。这些是以下形式的:

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

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

2

不知Levenshtein Distance会帮助你在这种情况下。它会给你两个文件有多相似,但我不知道你是否可以在@上进行归零。有什么可以看的。

1

我相信你正在寻找的是2串之间的距离,也许this可以帮助你。

1

如果不写程序来学习一些有关DIFF算法,但只是寻找一个解决方案,你应该尝试diff-match-patch。它包含不同编程语言(cpp,c#,java,javascript,python)中diff和patch算法的实现。

我想它的Java版本和它的工作就像一个魅力。

1

有点过时的,我想:)但我碰到这个职位来是因为我一直在寻找对同一问题的帮助:我有两个文件,我肩并肩显示,我必须标记线是不匹配红色。但是,由于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中是否有对应的行。如果是这样,请删除两者。你留下的只是差异,你可以很容易地在原文中标出这些行。

非常容易,不包括图书馆。只是我的两美分...