2011-06-17 8 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メソッドとほぼ同じように機能しますが、重要な違いが1つあります。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

で動作するように変更され、我々はどのようにファイルの大きなを話していますか?

1つの戦略は、一度に1つの行を読み込み、Hashset<int>などの既存の項目を簡単にチェックできるデータ構造にロードすることです。私はGetHashCode()を使ってファイルの各文字列を確実にハッシュすることができることを知っています(文字列の等価性をチェックするために内部で使用されています)。 Blindyが提案ように、

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()方法を利用せず、1行でそれを行うことができます。

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); 
} 
関連する問題