2013-02-28 75 views
2

我知道使用StreamReader讀取和寫入文件的基礎沒有關於比較的想法!如何檢查另一個文件c#中的文件內容?

enter image description here

,你可以在上面的圖片看到我有兩個文件,錯誤文件和存檔文件。我需要根據位置來比較 與第2列從(9〜11)如(111)在文本文件中位於9位,檔案文件中的第二列位於文本文件中的相同位置(9至11)。

如果來自錯誤文件的代碼存在於存檔文件中,則將整個記錄複製到新文件。

我需要使用C#執行此活動嗎?

編輯:文件是.txt但分隔符不是相同的。翼片有時 2或3,但位置是固定的9至11,現在,但如果格式是嚴格它可以在將來 像14變更爲16。

+0

你現在做了什麼?如果沒有,你應該得到你的文件的所有行並循環它們,閱讀此:http://www.dotnetperls.com/file-readalllines – 2013-02-28 12:31:10

+0

那麼這些文件只有.txt文件和列的分隔符是一個選項卡? – 2013-02-28 12:33:56

+0

文件是.txt,但分隔符不同。的選項卡有時它2或3但是現在位置固定爲9到11,但它可能會在14到16之後改變。 – 2013-02-28 12:34:40

回答

1

一種有效和簡潔的方法,其應該工作:

var positions1 = new[] { 9, 10, 11 }; 
var positions2 = new[] { 14, 15, 16 }; 
var f1Lines = File.ReadLines(path1) 
    .Select((l, i) => new { Line = l, Cols = l.Split('\t'), Num = i + 1 }) 
    .Where(x => x.Cols.Length >= 2); 
var f2Lines = File.ReadLines(path2) 
    .Select((l, i) => new { Line = l, Cols = l.Split('\t'), Num = i + 1 }) 
    .Where(x => x.Cols.Length >= 2); 
var toBeArchived = from i in positions1 
        join f1 in f1Lines on i equals f1.Num 
        join f2 in f2Lines on f1.Cols[1] equals f2.Cols[1] 
        where positions2.Contains(f2.Num) 
        select new { f1, f2 }; 
foreach (var toArchive in toBeArchived) 
{ 
    // i'm not sure what you want to do with it finally 
    // use File.WriteAllLines if you want to create the merged files 
} 

LINQ查詢連接行上的兩個文件,並且只有行9,10和11在第二列相等時連接。請注意,您需要添加using System.IOusing System.Linq;

+0

我需要將匹配的值行寫入新文件,我不知道LINQ如何在這裏讀取輸入文件? – 2013-02-28 12:51:28

+0

但在我的第二檔案記錄不在9,10,11位置。 – 2013-02-28 12:52:56

+0

@ViswanathanIyer:它可以在file1中的9-11和file2中的9-11中,但它們不一定必須在同一行中,這是正確的嗎? – 2013-02-28 12:54:35

相關問題