Supprimer les doublons dans un fichier texte

dmfdmf Messages postés 38 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 15 avril 2012 - 10 nov. 2009 à 15:58
dmfdmf Messages postés 38 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 15 avril 2012 - 10 nov. 2009 à 22:18
Bonjour à tous,

Voilà, j'ai un fichier texte contenant des valeurs Xdebut Ydebut Xfin Yfin de coordonnées.
comment supprimer les lignes identiques dans les 2 sens soit:
1)une ligne peut être identique à une autre en ayant le début et la fin identiques
2)une ligne peut être identique à une autre en ayant le début et la fin opposés
Pour ce faire, j'ai créé 2 String pour comparer les lignes "LigneA" et LigneB"
enfin mon code :
// ----- detruire les doubles lignes
       try {
              FileReader fichierGeometrie = new FileReader("./std/dmf.tmp");
              BufferedReader buf = new BufferedReader(fichierGeometrie);
              String ligne = buf.readLine();
               while (ligne!=null){
                    String[] c = ligne.split(",");
                    style c[0]; couleur c[1]; Xdebut = c[2]; Ydebut = c[3]; Xfin = c[4]; Yfin = c[5];
                    String LigneA =(Xdebut+Ydebut+Xfin+Yfin);
                           while (ligne!=null){
                             String[] d = ligne.split(",");
                             ligne = buf.readLine();
                             style d[0]; couleur d[1]; Xdebut = d[2]; Ydebut = d[3]; Xfin = d[4]; Yfin = d[5];
                             String LigneB =(Xfin+Yfin+Xdebut+Ydebut);
                             if (LigneA.equals(LigneB)){System.out.println("LA="+LigneA+" est egale a LB= "+LigneB);}
                             else {System.out.println("LA="+LigneA+" pas egale a LB= "+LigneB);}
                            ligne = buf.readLine();
                         }
                 ligne = buf.readLine();//---- la boucle s'arrete a la premiere ligne?
               }
               buf.close();
             }catch (Exception err) {
               JOptionPane.showMessageDialog(null,"impossible de supprimer la double ligne.");
                System.out.println(err);}
// ------------------------------------------ Fin detruire les doubles lignes

la boucle s'arrete a la première ligne sur LigneA
la boucle LigneB fonctionne bien ?

Merci pour votre aide,

Amicalement,
dmfdmf

5 réponses

tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
10 nov. 2009 à 16:56
Bonjour,
Si je traduis en Français, je vois :

Lire LigneA
Lire LigneB
traitement
continuerB jusqu'à la fin
continuerA

Donc tu n'auras qu'une seule ligne A car B va épuiser le fichier.
En clair, tu dis si la première ligne existe d'autres fois.

Tu peux ouvrir ton fichier 2 fois (1 pour A et 1 pour B) mais il faut faire attention de ne pas comparer chaque ligne avec elle-même (tu n'aurais plus rien en résultat)
Moi, je constituerai un tableau avec ce que j'ai lu et je vérifierai si la nouvelle lecture correspond à un élément de mon tableau (ligne déjà rencontrée donc). Tu charges en mémoire mais tu ne lis le fichier qu'une fois.


thip
0
dmfdmf Messages postés 38 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 15 avril 2012
10 nov. 2009 à 17:15
Bonjour Tpoinsot,

tu as raison, B épuise bien mon fichier !

C'est surement pour ça que ma boucle LigneA s'arrete à la première ligne et que ma boucle LigneB lit le fichier en entier

dois-je ouvrir mon fichier dans 2 buffers et faire un buf.readLine au début du 2eme pour éviter qu'il ne compare les mêmes lignes ?

je ne vois pas ton tableau, aurais-tu un exemple pour m'aider ? :)

Merci,

dmfdmf
0
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
10 nov. 2009 à 18:09
mon idée de tableau (ou plutôt une liste) est de faire:

Lire LigneB
LigneB est-elle dans listeDeLigneA?
si oui, traiter
si non, incorporer LigneB à listeDeLigneA
continuer

listeDeLigneA peut être de type ArrayList<String>. Ou tu peux créer une classe X contenant 2 points (x, y) et tu aurais une ArrayList<X>

Et pour te simplifier, incorpore 2 fois chaque ligneB dans la liste, pour tenir compte de l'inversion des points.
Là, faut pas avoir des milliards de lignes de fichier parce que le programme va ramer.

Si tu préfère ouvrir un second buffer, il faut lire les B du début du fichier jusqu'à A non inclus (réponse à : ai-je déjà rencontré ce cas ?) , ou bien lire les B après A jusqu'à la fin (réponse à : vais-je rencontrer ce cas ?). La première solution me semble meilleure.
0
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
10 nov. 2009 à 18:12
J'oubliais : il faut faire un meilleur test entre LigneA et LigneB, car avec ton code, tu peux avoir égalité par erreur.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dmfdmf Messages postés 38 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 15 avril 2012
10 nov. 2009 à 22:18
Merci Tpoinsot,

J'ai fais avec le buffer et une awt.List
mais j'ai encore un petit soucis,
je reposterais si je n'y arrive pas,
encore merci pour les conseils,

Amicalement,
dmfdmf
:)
0
Rejoignez-nous