IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Comparaison de 2 fichiers et afficher uniquement les différences


Sujet :

C#

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2008
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Comparaison de 2 fichiers et afficher uniquement les différences
    Bonjour,

    j'aurai besoin d'aide pour un programme que je veux faire.
    L'idée est la suivante:

    Je possède 2 fichiers clients (un fichier avec 1200 entrées et l'autre avec 450 entrées) au format csv contenant les deux, email, nom, prénom , groupe.
    J'affiche le contenu des 2 fichiers dans des listbox distinctes sans problème. C'est à partir de là que j'ai besoin d'aide! j'aimerai comparer le contenu des 2 fichiers. Tous les contacts qui figurent uniquement dans le fichier 1 de 1200 clients, j'aimerai les récupérer et les afficher dans une autre listBox puis, sauvegarder dans un fichier. Les contacts qui sont présents dans les 2 fichiers je veux les ignorer.

    ex:
    fichier 1 : dupont Marc .... fichier 2 dupont Marc
    fichier 1 : dupont Jean .... fichier 2 Alberto Yan
    fichier 1 : Alberto Yan ..... fichier 2 etc....

    ---> Afficher dupont Jean dans la listBox

    Voilà, j'espère être assez clair!

    Merci d'avance pour votre aide.

    Neophyte

  2. #2
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    J'imagine que tu as une classe représentant ces entités.

    Dans ce cas un peu de LINQ devrait faire l'affaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    firstList.Where(person => !secondList.Any(other => other.FirstName == person.FirstName && other.LastName == person.LastName && other.Email == person.Email))
    Pour identifier une personne j'utilise nom, prénom et email.

    Le mieux bien sûr c'est si tu as des identifiants uniques dédiés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    firstList.Where(person => !secondList.Any(other => other.Id == person.Id))
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2008
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Pragmateek Voir le message
    J'imagine que tu as une classe représentant ces entités.

    Dans ce cas un peu de LINQ devrait faire l'affaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    firstList.Where(person => !secondList.Any(other => other.FirstName == person.FirstName && other.LastName == person.LastName && other.Email == person.Email))
    Pour identifier une personne j'utilise nom, prénom et email.

    Le mieux bien sûr c'est si tu as des identifiants uniques dédiés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    firstList.Where(person => !secondList.Any(other => other.Id == person.Id))
    Hello,

    Merci pour ta réponse et désolé pour le retard.. Mais entre le travail et les hobbys ce n'est pas toujours évident.
    Alors non, j'ai fait vraiment ça à la bourrin et je ne pense pas que ce soit un code très optimale mais bon je n'ai plus programmé depuis 5 ans donc mes souvenirs sont quelques peu altérés!

    Ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    namespace Tri_Liste_emails
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            StreamReader file = new StreamReader(@"C:\Users\Michel\Desktop\complet.csv");
            StreamReader file2 = new StreamReader(@"C:\Users\Michel\Desktop\mix_clients_test.csv");
     
            private void Form1_Load(object sender, EventArgs e)
            {
                int NombreClients = 0;
                int NombreClients2 = 0;
                string line;
                string line2;
     
                while (((line = file.ReadLine()) != null))
                {
                    list_Box_donnees.Items.Add(line);
                    NombreClients++;
                }
                file.Close();
                lbl_nombre_lignes.Text = NombreClients.ToString();
     
                while ((line2 = file2.ReadLine()) != null)
                {
                    ListBoxDonnees2.Items.Add(line2);
                    NombreClients2++;
                }
                file2.Close();
                lbl_nombre_lignes2.Text = NombreClients2.ToString();
            }
        }
    }
    Chaque ligne client va sortir sous la forme : Jean@email.com;Jean;Dupond;Defaut;1 (A savoir Email;Nom;Prénom;Groupe;Langue). Je n'ai pas besoin de faire la différence sur chaque élément. Ce qui m'importe c'est de savoir si l'email en question est présent dans les 2 listes et si oui, l'ignorer et si il est que dans la première liste, le sauvegarder dans un autre fichier etc...

    Je ne sais donc pas si ton code s'adapte à ce que j'ai fait.

  4. #4
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    C'est en effet un peu brut de décoffrage.

    Donc l'entité Person :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Person
    {
        public string Email { get; set; }
        public string LastName { get; set; }
        public string FirstName { get; set; }
        public string Group { get; set; }
        public string Language { get; set; }
    }
    Et le reste du code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    private Person ParsePerson(string line)
    {
        string[] tokens = line.Split(';');
     
        return new Person
        {
            Email = tokens[0],
            LastName = tokens[1],
            FirstName = tokens[2],
            Group = tokens[3],
            Language = tokens[4]
        };
    }
     
    private void Form1_Load(object sender, EventArgs e)
    {
        int NombreClients = 0;
        int NombreClients2 = 0;
        string line;
        string line2;
     
        List<Person> firstList = new List<Person>();
        List<Person> secondList = new List<Person>();
     
        while (((line = file.ReadLine()) != null))
        {
            list_Box_donnees.Items.Add(line);
            NombreClients++;
     
            firstList.Add(ParsePerson(line));
        }
        file.Close();
        lbl_nombre_lignes.Text = NombreClients.ToString();
     
        while ((line2 = file2.ReadLine()) != null)
        {
            ListBoxDonnees2.Items.Add(line2);
            NombreClients2++;
     
            secondList.Add(ParsePerson(line2));
        }
        file2.Close();
     
        lbl_nombre_lignes2.Text = NombreClients2.ToString();
     
        List<Person> toKeep = firstList.Where(person => !secondList.Any(other => other.Email == person.Email)).ToList();
    }
    A double-checker mais ça devrait le faire...
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

Discussions similaires

  1. Afficher uniquement les fichier .mp3 du dossier
    Par dercom dans le forum Langage
    Réponses: 4
    Dernier message: 24/09/2013, 11h08
  2. Comment afficher uniquement les fichiers d'un répertoire
    Par choucs dans le forum Shell et commandes GNU
    Réponses: 8
    Dernier message: 29/08/2013, 15h31
  3. <html:file> afficher uniquement les fichiers .txt dans la boite de dialogue
    Par antoine.ginsburg dans le forum Développement Web en Java
    Réponses: 0
    Dernier message: 04/06/2013, 18h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo