2011-06-17 77 views
4

有人能證明文件是如何被檢查重複的行,然後任何重複被刪除或者覆蓋現有文件,或創建一個新的文件與重複的行刪除C# - 一個文本文件中刪除重複的行

+0

@Felice Pollano沒有伴侶,除非我一個28歲的學生:D – Michael

+1

好的,但無論如何,你要求完成一項工作... –

回答

10

如果你使用.NET4那麼你可以使用的File.ReadLinesFile.WriteAllLines組合:

var previousLines = new HashSet<string>(); 

File.WriteAllLines(destinationPath, File.ReadLines(sourcePath) 
             .Where(line => previousLines.Add(line))); 

它的功能與LINQ的Distinct方法幾乎相同,但有一個重要區別:Distinct的輸出不能保證與輸入序列的順序相同。明確地使用HashSet<T>確實提供了這種保證。

1

僞代碼:

open file reading only 

List<string> list = new List<string>(); 

for each line in the file: 
    if(!list.contains(line)): 
     list.append(line) 

close file 
open file for writing 

for each string in list: 
    file.write(string); 
+0

男人,非常感謝你的僞代碼幫了我很多 – BOSS

+0

沒問題的人。 – mrK

2
File.WriteAllLines(topath, File.ReadAllLines(frompath).Distinct().ToArray()); 

編輯:修改.NET 3.5

1

如何文件的大都是我們討論的工作?

一種策略可能是逐行讀取一行,並將其加載到數據結構中,以便輕鬆檢查現有項目,如Hashset<int>。我知道我可以可靠地使用GetHashCode()對文件的每個字符串行進行散列(內部用於檢查字符串相等性 - 這是我們想要確定重複項),並檢查已知散列。所以,像

var known = new Hashset<int>(); 
using (var dupe_free = new StreamWriter(@"c:\path\to\dupe_free.txt")) 
{ 
    foreach(var line in File.ReadLines(@"c:\path\to\has_dupes.txt") 
    { 
     var hash = line.GetHashCode(); 
     if (!known.Contains(hash)) 
     { 
      known.Add(hash); 
      dupe_free.Write(line); 
     } 
    } 
} 

或者,你可以利用的LINQ的Distinct()方法,並做到這一點的一條線,作爲Blindy建議:

File.WriteAllLines(@"c:\path\to\dupe_free.txt", File.ReadAllLines((@"c:\path\to\has_dupes.txt").Distinct().ToArray()); 
+0

@LukeH對,這就是爲什麼我的主要答案是讀寫他們在手寫循環;哈希集是一個便宜的查找,並與gethashcode它保證正確的順序和唯一性。 –

1
// Requires .NET 3.5 
private void RemoveDuplicate(string sourceFilePath, string destinationFilePath) 
{ 
    var readLines = File.ReadAllLines(sourceFilePath, Encoding.Default); 

    File.WriteAllLines(destinationFilePath, readLines.Distinct().ToArray(), Encoding.Default); 
}