C# - 删除文本文件中的重复行

时间:2011-06-17 14:56:16

标签: c# .net windows

有人可以演示文件如何检查重复行,然后删除任何重复项覆盖现有文件,或创建删除重复行的新文件

5 个答案:

答案 0 :(得分: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 :(得分:2)

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

编辑:修改为在.net 3.5中工作

答案 2 :(得分: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);

答案 3 :(得分: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());

答案 4 :(得分: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);
}