2010-07-28 3 views
0

Мне нужно разработать приложение, в котором сравниваются два файла csv. В первом файле есть список адресов электронной почты. Второй список также содержит адреса электронной почты, но включает информацию о имени и адресе. Первый список содержит адреса электронной почты, которые необходимо удалить из второго списка. У меня есть быстрый CSV-ридер с сайта CodeProject, который работает очень хорошо. Приложение не будет иметь доступа к серверу базы данных. Новый файл будет создан с данными, которые считаются проверенными. Значит, он не будет содержать никакой информации из первого файла.Сравнение 2 файлов CSV в совете C#?

+0

Когда вы удаляете адреса электронной почты из второго файла, должны ли остальная часть данных в строке оставаться или вы удаляете всю строку? – AllenG

ответ

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 в список, а затем передать его, и список адресов, чтобы удалить как список в метод.

+0

Именно то, что я искал. Кроме того, если кому-то интересно, я нашел эту классную библиотеку LINQ to CSV: http://www.codeproject.com/KB/linq/LINQtoCSV.aspx – DDiVita

1

Не знаете, какой совет вам нужен, это звучит прямо.

Heres быстрый набросок алгоритма:

  • цикл по электронной почте от первого CSV
    • положить каждое письмо в HashSet <>
  • запустить удаления
  • положить каждый выход электронная почта в том же HashSet <>
    • если есть DuplicateKeyException, вы пропустили один в
    • удаления
    • если emailList2.Count - emailList1.Count = outputList.Count, вы удалили слишком много
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); 

Кстати, выше должно быть O (N * Log (N)) сложности, по сравнению с использованием ответ Linq, который будет O (N^2) на Неиндексированные данных.

Смежные вопросы