有人可以演示文件如何检查重复行,然后删除任何重复项覆盖现有文件,或创建删除重复行的新文件
答案 0 :(得分:10)
如果您使用的是.NET4,则可以使用File.ReadLines
和File.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);
}