2013-08-26 47 views
0

我有一種情況,我需要比較兩個文本文件(使用C#),傳入文本文件和現有文本文件,檢查更改/差異。兩個文本文件具有相同的佈局,6列是相同類型的數據和列標題。所以這基本上是一個檢查,以查看傳入文件的內容是否與現有文件相比有任何新數據。比較兩個文本文件的特定列值 - C#

File.ReadAllText方法本質上是做我想要的,但問題是,我只想比較文本文件的前兩列中的值,並忽略其他結尾列。

該文本文件的佈局是這樣的:

項目#|共 | C3 | C4 | C5 | C6

123 | 7 | 0 | 0 | 0 | 0

因此,如果第一個文件中的Item#或Total列中的任何一個與第二個文件相比有變化,則文件比較應該在此處停止,並且應該將其視爲文件更改。

什麼是簡單的方法來解決這個問題?非常感謝。

+1

比較你試過什麼,在哪裏你有打? –

+0

每個文件只有一行? –

+0

Hi @Sriram Sakthivel,我試圖使用File.ReadAllText,但我相信可能有其他列(而不是C1或C2)可能已更改值,並且我想要忽略這些列中的任何更改。 –

回答

2

當您使用string.Split和LINQ的TakeSequenceEqual時,這是一個簡單的問題。

bool AnyDifferent(string file1FullText, string file2FullText) 
{ 
    string[] file1Lines = file1FullText.Split('\n'); 
    string[] file2Lines = file2FullText.Split('\n'); 
    if (file1Lines.Length != file2Lines.Length) 
     return true; 
    for (int i = 0; i < file1Lines.Length; i++) 
    { 
     var file1LineSplit = file1Lines[i].Split('|'); 
     var file2LineSplit = file2Lines[i].Split('|'); 
     if (!file1LineSplit.Take(2).SequenceEqual(file2LineSplit.Take(2))) 
      return true; 
    } 
    return false; 
} 

編輯或改進的性能使用File.ReadLines(你不必在開始比較之前讀取整個文件):

bool AnyDifferent(string file1Path, string file2Path) 
{ 
    using (var file1Enumerator = File.ReadLines(file1Path).GetEnumerator()) 
    using (var file2Enumerator = File.ReadLines(file2Path).GetEnumerator()) 
    { 
     while (true) 
     { 
      bool result1 = file1Enumerator.MoveNext(); 
      bool result2 = file2Enumerator.MoveNext(); 
      if (result1 != result2) 
       return true; 
      else if (!result1 && !result2) 
       return false; 
      var file1LineSplit = file1Enumerator.Current.Split('|'); 
      var file2LineSplit = file2Enumerator.Current.Split('|'); 
      if (!file1LineSplit.Take(2).SequenceEqual(file2LineSplit.Take(2))) 
       return true; 
     } 
    } 
} 
+0

我會在一個文件上使用'File.ReadLines',那麼即使'Length'或第一行已經不同,你也不需要先將兩個文件讀入內存。 –

+0

@TimSchmelter現在你提到它,爲什麼不在這兩個文件上使用'File.ReadLines'? –

+0

因爲您需要將兩條線相互比較,並且如果您在兩者上都使用'ReadLines',則始終需要枚舉所有行以找到正確的索引。您可以在延遲線和陣列上的索引器上使用'foreach'。 **編輯**更重要的是:由於底層的閱讀器在第一次使用之後被丟棄,因此無法多次實現或列舉「ReadLines」。 –

0

我將創建一個類爲每個項目:

class Item 
{ 
    public int ItemNumber { get; set; } 
    public int Total { get; set; } 
} 

然後用列表和比較數據

List<Item> items = new List<Item>(); 
foreach (String line in File.ReadAllLines("filepath")) 
{ 
    Item item = new Item 
    { 
     ItemNumber = Convert.ToInt32(line.Split('|')[0]), 
     Total = Convert.ToInt32(line.Split('|')[1]) 
    }; 
} 

,那麼你有一個堅實的結構,將其與