比较文件并删除重复

时间:2009-10-06 03:31:08

标签: c#

我有两个文件:

文件1.txt

abc@ewr.com
xyc@df.co.nz
rte@pope.com
ssddsf@fdf.com

文件2.txt

rgt@ewr.com
xyc@df.co.nz
rte@pope.com
abc@fdf.com
sert@fd.com
tiffer@fg.com

我想首先检测重复,然后从File1中删除重复。

怎么做。

4 个答案:

答案 0 :(得分:1)

如果您同时阅读他们自己的List<string>,那么您可以这样做:

// file1 is a List<string> representing each line of file1
// file2 is a List<string> representing each line of file2
List<string> file1WithoutDupes = (from line in file1
                                  where !file2.Contains(line)
                                  select line).ToList();

你最终不会合并这两个名单。

答案 1 :(得分:0)

另一个解决方案是使用哈希表。

从具有keys =文件条目的哈希表中的第一个文件加载条目。 然后在从第二个文件插入条目之前检查密钥是否已经存在。

答案 2 :(得分:0)

如果您还没有列表中文件的内容,请按以下步骤操作:

var file1 = File.ReadAllLines(file1Path);
var file2 = File.ReadAllLines(file2Path);
var dupes = Array.FindAll(file1, line =>
    Array.Exists(file2, line2 => line2 == line));
var noDupes = Array.FindAll(file1, line =>
    !Array.Exists(dupes, line2 => line2 == line));
File.WriteAllLines(file1Path, noDupes); // write back to file1

但是,如果你将file1和file2的内容存储在List<string>中,你可以写:

// Option #1: LINQ, returns results
var dupes = file1.Intersect(file2);
var noDupes = file1.Except(dupes);
File.WriteAllLines(file1Path, noDupes.ToArray());

// Option #2: generic collection methods
List<string> dupes = file1.FindAll(item => file2.Contains(item));
file1.RemoveAll(item => dupes.Contains(item)); // affects original list
File.WriteAllLines(file1Path, file1.ToArray());

在.NET 4.0中,您应该能够使用返回IEnumerable<string>的{​​{3}},并且比File.ReadAllLines返回的字符串数组具有更大的灵活性。此外,File.ReadLines method已超载以接受IEnumerable<string>,这样我们就可以放弃在上述代码段中看到的ToArray()来电。

编辑请注意,在两个代码示例中,您都可以跳过dupes部分,直接使用file2代替dupes变量确定noDupes的结果分别是Array和LINQ方法。如果你需要参考傻瓜,我把它留在了里面。

答案 3 :(得分:0)

如果我理解正确,你想要文件1中不存在于文件2中的行。试试这个:

var lines1=File.ReadAllLines("File1.txt");
var lines2=File.ReadAllLines("File2.txt");
var file1OnlyLines=lines1.Except(lines2).ToList();