Это должно сделать (и скопировать с большими файлами).
Обратите внимание, что удаляются только дубликаты последовательных строк, т.е.
a
b
b
c
b
d
закончится как
a
b
c
b
d
Если вы не хотите, чтобы где-либо дублировались, вам нужно сохранить набор линий, которые вы уже видели.
using System;
using System.IO;
class DeDuper
{
static void Main(string[] args)
{
if (args.Length != 2)
{
Console.WriteLine("Usage: DeDuper <input file> <output file>");
return;
}
using (TextReader reader = File.OpenText(args[0]))
using (TextWriter writer = File.CreateText(args[1]))
{
string currentLine;
string lastLine = null;
while ((currentLine = reader.ReadLine()) != null)
{
if (currentLine != lastLine)
{
writer.WriteLine(currentLine);
lastLine = currentLine;
}
}
}
}
}
Обратите внимание, что это предполагает Encoding.UTF8
, и что вы хотите использовать файлы. Легко обобщить как метод, хотя:
static void CopyLinesRemovingConsecutiveDupes
(TextReader reader, TextWriter writer)
{
string currentLine;
string lastLine = null;
while ((currentLine = reader.ReadLine()) != null)
{
if (currentLine != lastLine)
{
writer.WriteLine(currentLine);
lastLine = currentLine;
}
}
}
(Обратите внимание, что это ничего не закрывает - вызывающий должен сделать это.)
Вот версия, которая удалит все дубликаты, а не только последовательные:
static void CopyLinesRemovingAllDupes(TextReader reader, TextWriter writer)
{
string currentLine;
HashSet<string> previousLines = new HashSet<string>();
while ((currentLine = reader.ReadLine()) != null)
{
// Add returns true if it was actually added,
// false if it was already there
if (previousLines.Add(currentLine))
{
writer.WriteLine(currentLine);
}
}
}