在C#建议中比较2个CSV文件?

时间:2010-07-28 20:26:07

标签: c# .net-3.5 csv

我需要开发一个比较两个csv文件的应用程序。第一个文件包含电子邮件地址列表。第二个列表也有电子邮件地址,但包括姓名和地址信息。第一个列表包含需要从第二个列表中删除的电子邮件地址。我有CodeProject网站的Fast CSV阅读器,效果很好。应用程序将无法访问数据库服务器。将生成一个新文件,其中包含被认为已验证的数据。意思是,它不包含第一个文件中的任何信息。

3 个答案:

答案 0 :(得分:2)

如果您将两个列表都读入集合,则可以使用Linq来确定地址子集。

这是我为你掀起的一个快速示例课程。

using System;
using System.Linq;
using System.Collections.Generic;

public class RemoveExample
{
    public List<Item> RemoveAddresses(List<Item> sourceList, List<string> emailAddressesToRemove)
    {
        List<Item> newList = (from s in sourceList
                              where !emailAddressesToRemove.Contains(s.Email)
                              select s).ToList();
        return newList;
    }

    public class Item
    {
        public string Email { get; set; }
        public string Name { get; set; }
        public string Address { get; set; }
    }
}

要使用它,请将csv读入List,然后将其传递,并将地址列表作为List删除到方法中。

答案 1 :(得分:1)

不确定您需要什么样的建议,听起来很直接。

这是一个快速的算法草图:

  • 循环来自第一个csv的电子邮件
    • 将每封电子邮件放入HashSet&lt;&gt;
  • 运行您的删除
  • 将每个输出电子邮件放在同一个HashSet&lt;&gt;中
    • 如果存在DuplicateKeyException,则您在删除
    • 中错过了一个
    • if emailList2.Count - emailList1.Count!= outputList.Count,删除了太多

答案 2 :(得分:1)

这是相对简单的,假设列表不是非常大或内存使用不是一个过大的问题:在两个单独的HashSet<string>实例中读取两组电子邮件地址。然后,您可以使用HashSet<T>.ExceptsWith查找两组之间的差异。例如:

HashSet<string> setA = ...;
HashSet<string> setB = ...;

setA.ExceptWith(setB); // Remove all strings in setB from setA

// Print all strings that were in setA, but not setB
foreach(var s in setA)
   System.Console.WriteLine(s);
BTW,上面应该是O(n * log(n))复杂度,而不是使用Linq答案,这对非索引数据来说是O(n ^ 2)。