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

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

Solutions Collecting From Web of "C# – 删除文本文件中的重复行"

如果您使用的是.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>确实提供了这个保证。

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

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

伪代码:

 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); 
 // 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); } 

我们有多大的档案?

一种策略可能是Hashset<int>读取一行,并将其加载到数据结构中,以便轻松检查现有项目,如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());