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 ligne dans 2 textes [Débutant]


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 254
    Points : 55
    Points
    55
    Par défaut Comparaison de ligne dans 2 textes
    Bonjour, je cherche le moyen de comparer 2 fichier TXT (Txt1 et Txt2)
    je voudrai récupérer et noter dans Txt1 les lignes de Txt2 manquante dans Txt1 ou récupérer ces lignes dans un textBox .
    mes fichiers texte sont du genre:
    100 test1
    202 test66
    300 test-Kl
    etc....
    J'ai commencé avec TextReader mais je ne vois pas comment avancer dans tous le fichier avec une boucle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
                TextReader tr = new StreamReader(@"C:\\Documents and Settings\\Laurent\\Bureau\\Txt1.txt");
                //TextReader tr = new StreamReader(richTextBox1.Text.ToCharArray);
                TextReader tr2 = new StreamReader(@"C:\\Documents and Settings\\Laurent\\Bureau\\Txt2.txt");
                string txt1 = tr.ReadLine();
                string txt2 = tr2.ReadLine();
    while (!txt1.StartsWith(txt2))
    {
    ???
    TextBox1.Text = txt2;
    }
    Merci pour votre aide,

  2. #2
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 69
    Points : 93
    Points
    93
    Par défaut
    Bonjour lolo,

    Dans tes fichiers, est ce que les nombres (100, 202, 300...) sont unique tout fichiers confondus? Si oui, tu pourrais lire les 2 fichiers et récupérer chaque ligne dans un Dictionary<int, string>. Puis tu regrouperais les 2 dicos dans 1 seul en vérifiant que la ligne contenant le nombre XXX n'y est pas déjà.

    Pour avancer dans le texte d'un fichier, il te faut une boucle de ce genre :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    string txt1 = tr.ReadLine();
     
    while (txt1 != null)
    {
    ???
    TextBox1.Text = txt1;
     
    // Je lis la ligne suivante
    txt1 = tr.ReadLine();
    }

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 254
    Points : 55
    Points
    55
    Par défaut
    Bonjour,
    oui ils sont unique mais parfois accompagné d'une lettre ce qui rend difficile le tri pour dictionary<int, string>.
    Voila ou j'en suis mais ça ne fonctionne pas car les lignes de Txt1 ne sont pas lu.
    Je me demandais aussi si c'etait possible de charger les fichier TXT dans des textBox et en suite comparer les lignes mais je ne vois pas comment.

    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
     
                int lignesTxt1 = 0; // Nombre de lignes dans Txt1
                int lignesTxt2 = 0; // Nombre de lignes dans Txt2
     
                TextReader tr2 = new StreamReader(@"C:\\Documents and Settings\\Laurent_Eepc\\Bureau\\Txt2.txt");
                string txt2 = tr2.ReadLine();
     
                TextReader tr = new StreamReader(@"C:\\Documents and Settings\\Laurent_Eepc\\Bureau\\Txt1.txt");
                string txt1 = tr.ReadLine();
     
                while (tr.ReadLine() != null) { lignesTxt2++; }//Compte les lignes de Txt1
     
                while((lignesTxt1 <= lignesTxt2) && (txt1 != null) && (txt2 != null))
                {
                    if (!txt1.StartsWith(txt2) && (txt1 != null) && (txt2 != null))
                    {
                        textBox2.Text = textBox2.Text+ txt1 ;                   
                        lignesTxt1++;
                        txt1 = tr.ReadLine();
                    }
                }

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 69
    Points : 93
    Points
    93
    Par défaut
    Attention, tu fais un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     while (tr.ReadLine() != null) { lignesTxt2++; }//Compte les lignes de Txt1
    Ne serait-ce pas plutôt : { lignesTxt1++; } ?

    En même temps tu fais un "while (tr.ReadLine() != null)", et donc avant de rentrer dans ta deuxième boucle while tu as déjà lu tout ton fichier Txt1. Donc le "txt1 = tr.ReadLine();" de ta deuxième boucle while renverra toujours null!

    Si tu as un peu de mal pour lire un fichier, lis chaque fichier l'un après l'autre, pas les 2 en même temps. Par exemple, tu lis le premier fichier et tu stockes toutes les infos dans une variable "toto" (qui peut être une liste, un dico...). Ensuite tu lis le fichier Txt2 et au fur et à mesure que tu le lis tu ajoutes dans le dico "toto" chaque info en ayant vérifié que la ligne n'existait pas déjà.

    Si tu as encore du mal, n'hésite pas à me demander, je t'aiderai un peu + en détail.

  5. #5
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 493
    Points
    5 493
    Par défaut
    Bonjour.

    Pour la comparaison de séquences ordonnées, je me suis souvent retrouvé à écrire des codes avec la structure suivante qui, une fois n'est pas coutume, devrait merveilleusement faire l'affaire.

    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
    Tant que les deux flux ont encore des éléments
    {
       Si item1 < item2 Alors 
          item1 = pop(flux1)
          ...
       Sinon si item1 > item2 Alors
          item2 = pop(flux2)
          ...
       Sinon
          item1 = pop(flux1)
          item2 = pop(flux2)
          ...
       Fin Si
    }
     
    Tant que le flux n°1 a encore des éléments
    {
       ...
    }
     
     
    Tant que le flux n°2 a encore des éléments
    {
    }

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 254
    Points : 55
    Points
    55
    Par défaut
    J'ai donc mis comme tu suggéré Olivier782 les Txt dans 2 listes ( Listes1 et Listes2) mais je n'arrive pas à faire une boucle me permettant de voir si une ligne est présente dans la liste1 et pas dans la liste 2.
    Je cherche aussi à afficher la listes1 dans un textBox.
    Merci pour votre aide c'est sympa !!
    @: DonQuiche: je n'ai peut être pas le niveau pour implémenté çà correctement.merci quand même.
    Après mon 25eme café !! voila ou j'en suis:
    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
     
                int position = 0;
                int position2 = 0;
                List<string> liste1 = new List<string>();
                TextReader tr = new StreamReader(@"C:\\Documents and Settings\\Laurent_Eepc\\Bureau\\Txt1.txt");
                string line1;
                while ((line1 = tr.ReadLine()) != null)
                {
                    liste1.Add(line1);// Recup de Txt1 dans une liste
                }
                tr.Close();
     
                List<string> liste2 = new List<string>();
                TextReader tr2 = new StreamReader(@"C:\\Documents and Settings\\Laurent_Eepc\\Bureau\\Txt2.txt");
                string txt2 = tr2.ReadLine();
                string line2;
                while ((line2 = tr2.ReadLine()) != null)
                {
                    liste2.Add(line2);// Recup de Txt2 dans une liste
                }
                tr2.Close();
     
                while (liste1[position] == liste2[position2] && (liste1.Count - 2 > position))
                {
                    position++;
                    while (liste1[position] != liste2[position2])
                    {
                        textBox2.Text = liste1[position];
                        position2++;              
                    }
                }

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 69
    Points : 93
    Points
    93
    Par défaut
    Très bien pour la lecture des fichiers.

    Citation Envoyé par lolo81 Voir le message
    une boucle me permettant de voir si une ligne est présente dans la liste1 et pas dans la liste 2
    Je peux te proposer ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    foreach(string ligneTxt1 in liste1)
    {
       // Si la liste 2 ne contient pas la ligne actuelle de la liste 1, alors
       // l'ajouter à la liste 2
       if(!liste2.Contains(ligneTxt1)
       {
          liste2.Add(ligneTxt1);
       }
    }
    Ainsi tu as dans la liste 2 le regroupement de tes 2 fichiers en éliminant les doublons.

    Pour l'affichage dans une TextBox :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    TextBox txtBox = new TextBox();
    foreach(string ligneTxt1 in liste1)
    {
        txtBox.Text += ligneTxt1 + "\n";
        // Ou autre solution :
        txtBox.AppendText(ligneTxt1);
    }

    J'ai juste un doute si le "\n" va fonctionner ou non.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 254
    Points : 55
    Points
    55
    Par défaut
    Merci pour le compliment !!
    Citation Envoyé par Olivier782 Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    TextBox txtBox = new TextBox();
    foreach(string ligneTxt1 in liste1)
    {
        txtBox.Text += ligneTxt1 + "\n";
        // Ou autre solution :
        txtBox.AppendText(ligneTxt1);
    }

    J'ai juste un doute si le "\n" va fonctionner ou non.
    Effectivement le retour à la ligne ne fonctionne pas mais en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    textBox1.AppendText(ligneTxt1+ "\n");
    ça fonctionne.

    Ta boucle fonctionne mais le problème c'est qu'elle ne respecte pas la liste trié (liste1), là j'ajoute à ma liste2 les lignes de ma liste1 non présentes dans la liste2. (c'est tout de même une grosse avancé dans mon programme)
    J'ai donc modifier dans un premier temps en rajoutant une 3eme liste qui me permet de récupérer ces lignes manquantes pour en suite les reclasser dans le bon ordre dans ma liste1(fonction qui me reste à coder).
    Merci encore pour ton aide et ta patience

  9. #9
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 69
    Points : 93
    Points
    93
    Par défaut
    Pas de problème

    Pour trier une liste de strings, je te conseille de regarder du côté de la méthode Sort(). Si chacune de tes lignes commence par un nombre et que tu souhaites justement les trier par là, un simple appel à cette méthode sur ta liste te fait tout le boulot!

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 254
    Points : 55
    Points
    55
    Par défaut
    Merci !!!!!!!!!!!!!!!!!!!!!!!!!!!!



    Fonctionne parfaitement en faisant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
                foreach(string ligneTxt1 in liste1)
                {
                   // Si la liste 2 ne contient pas la ligne actuelle de la liste 1, alors
                   // l'ajouter à la liste 2
                   if(!liste2.Contains(ligneTxt1))
                   {
                      liste2.Add(ligneTxt1);
                      liste2.Sort();
                   }
                }

  11. #11
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 69
    Points : 93
    Points
    93
    Par défaut
    De rien!

    Pour optimiser ton code, tu devrais faire un Sort une fois que toute ta liste a été remplie, après la boucle "foreach(string ligneTxt1 in liste1)". En général on ne trie pas la liste à chaque fois que l'on ajoute un élément dedans! (surtout si on est dans une boucle ^^).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comparaison de ligne dans un fichier texte
    Par babynewton dans le forum MATLAB
    Réponses: 21
    Dernier message: 13/02/2012, 19h09
  2. Recupere une info suivant une ligne dans un texte.
    Par cyrilthebest8 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 15/12/2006, 18h04
  3. ecrire a la ligne dans fichier texte.
    Par zulot dans le forum Langage
    Réponses: 7
    Dernier message: 12/09/2006, 12h02
  4. [swing] jLabel et retour à la ligne dans le texte ?
    Par daed dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 04/05/2006, 11h35
  5. pb lecture de ligne dans un texte
    Par bidoo dans le forum C++
    Réponses: 4
    Dernier message: 22/10/2005, 13h23

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