2009-11-12 110 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中是否有對應的行。如果是這樣,請刪除兩者。你留下的只是差異,你可以很容易地在原文中標出這些行。

非常容易,不包括圖書館。只是我的兩美分...