2010-07-28 5 views
0

J'ai besoin de développer une application où deux fichiers CSV sont comparés. Le premier fichier contient une liste d'adresses e-mail. La deuxième liste contient également des adresses e-mail, mais inclut des informations sur le nom et l'adresse. La première liste contient les adresses e-mail qui doivent être supprimées de la deuxième liste. J'ai le lecteur Fast CSV du site CodeProject qui fonctionne plutôt bien. L'application n'aura pas accès à un serveur de base de données. Un nouveau fichier sera généré avec des données considérées comme vérifiées. Ce qui signifie, il ne contiendra aucune des informations du premier fichier.En comparant 2 fichiers CSV dans un conseil C#?

+0

Lorsque vous supprimez des adresses e-mail du second fichier, le reste des données de la ligne doit-il rester ou supprimez-vous la ligne entière? – AllenG

Répondre

2

Si vous lisez les deux listes dans des collections, vous pouvez utiliser Linq pour déterminer le sous-ensemble d'adresses.

Voici un exemple rapide de classe I fouetté pour vous.

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

Pour l'utiliser, lisez votre csv dans une liste, puis le transmettre, et votre liste d'adresses à éliminer, une liste dans la méthode.

+0

Exactement ce que je cherchais. Aussi, si quelqu'un est intéressé, j'ai trouvé cette bibliothèque LINQ to CSV cool: http://www.codeproject.com/KB/linq/LINQtoCSV.aspx – DDiVita

1

Vous ne savez pas quel type de conseil vous avez besoin, il semble simple.

Heres un croquis de l'algorithme rapide:

boucle
  • par courrier électronique de la première csv
    • mettre chaque email dans un HashSet <>
  • exécuter votre suppression
  • mettre chaque sortie email dans le même HashSet <>
    • s'il y a un DuplicateKeyException, vous avez manqué une dans la suppression
    • si emailList2.Count - emailList1.Count = outputList.Count, vous supprimé trop
1

Ceci est relativement simple, En supposant que les listes ne sont pas très volumineuses ou que l'utilisation de la mémoire ne soit pas un problème trop important: lisez les deux ensembles d'adresses de courrier électronique dans deux instances HashSet<string> distinctes. Ensuite, vous pouvez utiliser HashSet<T>.ExceptsWith pour trouver les différences entre les deux ensembles. Par exemple:

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, le devrait être O ci-dessus (n * log (n)) complexité, par rapport à l'aide de la réponse Linq, qui serait O (n^2) sur des données non indexées.

Questions connexes