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

Documents Java Discussion :

Gérer les doublons d'un CSV


Sujet :

Documents Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2015
    Messages : 49
    Par défaut Gérer les doublons d'un CSV
    Bonjour, je suis bloquer a la derniere etape de mon programme qui doit maintenant gerer les doublons.
    J'ai pensé a lire ligne par ligne mon fichier csv pour les ajouter dans un tableau, ensuite comparer chaque element de mon tableau entre eux, mais le probleme est que mes doublons ne sont pas forcement EXACTEMENT identique.


    En gros, mon fichier CSV contient des infos sur les eleves de plusieurs ecoles.
    les 5 colonnes de mon CSV : NOM, PRENOM, CLASSE, Code_ECOLE, NOM_ECOLE

    Les doublons ne se trouve pas au niveau de la ligne entiere, mais seulement pour le prenom et nom. Car certains eleves se sont inscrits dans plusieurs ecoles, mais les 3 dernieres colonnes ne sont complétés que dans l'ecole où il a été accepté.


    Du coup je ne dois pas comparer les lignes entre elles, ni une seule colonne avec une autre, mais 2 colonnes ( NOM et PRENOM ) et si il y a doublon, je dois supprimez la ligne entiere.

    Ca fait 2h que j'essaie mais je suis bloqué et a court d'idée :/


    Apercu de mon fichier CSV :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    "Nom";"Prénom";"Classe";"code_ecole","nom_ecole"
    "Washington";"George";"";"0086508H";"MACHIN"
    "Washington";"George";"TPS";"0086508H";"MACHIN"
    Dans cet exemple, j'aimerais supprimez la premiere ligne, car c'est tout le temps la ligne la plus basse qu'il faut garder.


    EDIT : Je viens d'avoir une idée, mais je n'arrive pas a la mettre en place : je voulais d'abord comparer les noms entre eux, si il y a un doublon de nom, alors regarder le prenom ( car il peut y avoir des freres et soeurs )
    Pour ca, je lis ligne par ligne, j'ajoute les 2 premieres colonnes dans une arrayList.
    Ensuite je compare les elements de l'arraylist en incrementant de 2 afin de ne tomber que sur les noms. Si doublons je compare les 2 prenoms. Mais comment faire pour ensuite aller supprimez la ligne correspondante ?

  2. #2
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 209
    Billets dans le blog
    52
    Par défaut
    Supposons pour le bien de mon exemple que ta ligne soit l'objet Enregistrement avec les propriétés Nom et Prénom.

    Il t'est possible de décarrer la structure suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map<String,Map<String,List<Enregistrement>>>
    Où pour la première Mp tu utilise la propriété Nom et la seconde le Prénom.

    En gros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    List<Enregistrement> listeAvecDoublon;//Déclaration juste pour savoir ce qu'on manipule
    Map<String,Map<String,List<Enregistrement>>> listeStructure = new HashMap<String,Map<String,List<Enregistrement>>>();
    for(Enregistrement ligne : listeAvecDoublon){
        if(listeStructure.get(ligne.getNom())== null){
            Map<String,List<Enregistrement>> prenomStructure = new  HashMap<String,List<Enregistrement>();
            List<Enregistrement> listeDoublon = new ArrayList<Enregistrement>();
            listeDoublon.add(ligne)
            prenomStructure .put(ligne.getPrenom() ,listeDoublon);
            listeStructure.put(ligne.getNom(),prenomStructure );
        } else {
            listeStructure .get(ligne.getNom()).get(ligne.getPrenom()).add(ligne);
            System.out.println(ligne.getNom()+" "+ligne.getPrenom()+" est en doublon");
    }
    Cependant, ce relativement consommateur en mémoire. Donc à éviter si tu dispose d'une liste supérieur à 10 000 entrées (avant ça passera sans problème).

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2015
    Messages : 49
    Par défaut
    Merci beaucoup.
    Pour l'instant je n'ai encore jamais utilisé ou vue l'objet "Map" donc je vais aller me renseigner pour pouvoir comprendre votre code ^^
    Quand a mes csv, ils varient entre 5000 et 10 000 lignes, donc ca devrait aller.

    Je vais etudié votre code, et je vous recontacterai si j'ai des problemes

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2015
    Messages : 49
    Par défaut
    J'ai étudié le code, mais je ne comprends pas ce que je dois faire pour les méthodes getNom() et getPrenom() qui servent juste a return Nom et Prenom ? Ce sont des méthodes que je dois mettre dans ma classe Enregistrement ?
    De plus, que dois contenir la listeAvecDoublons ? Si j'ai bien compris, je dois y ajouter tout les noms et prenoms de mon csv ?

  5. #5
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 209
    Billets dans le blog
    52
    Par défaut
    Les méthodes getPrenom() et getNom() sont à remplacer par ton moyen d’accéder au nom et au prénom. J'ai supposé posé qu'il y avait une classe enregistrement, pour facilité la compréhension du contenu de la map.

    L'idée dernière ce code est d'avoir une liste Enregistrement que tu as crée à partir de ton CSV. Par facilité, je préfère manipuler un objet plutôt que la string d'origine (Mais on peut faire la même chose sans l'objet)

    Si tu crée un objet Enregistrement, logiquement il serai préférable qu'il ai la tête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Enregistrement {
        private String nom;
        private String prenom;
        private String ecole;
        // de même avec les autres propritéts
        public Enregistrement(String nom, String prenom, String ecole) {// Autant que nécessaire. Ou la ligne directement et le découpage dans le constructeur.
            // TODO Faire les affectation
        }
     
       // TODO faire les getter//Setter.
    }
    Note: tu peux aussi ne pas mettre de getter/setter et rendre les propriétés publiques.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2015
    Messages : 49
    Par défaut
    j'ai essayé d'appliquer tes conseils mais j'arrive encore a faire bugger mon programme, et il faudrait que j'ai finit cette gestion des doublons avant 16h30 ...

    Petite aparté : Je suis actuellement etudiant en bac +2, je n'ai jamais appris le java à l'école. En ce moment, je suis en stage dans une mairie où me demande de leur faire des logiciels en java ... et où je n'ai aucun tuteur/formateur/programmeur qui peut m'aider. Personnelement je n'appelle pas ca une formation mais une auto-formation...
    C'est pour ca que je viens souvent demander de l'aide sur votre forum car je n'ai personne pour m'aider quand j'ai un probleme, et mon boss voudrait que mon logiciel soit finit avant 16h30 :/

    Enfin bref, voici mon message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    	at Main.CaptureColonne(Main.java:44)     //j'ai adapter la ligne pour le code plus bas
    ...
    Et voici mon code : si vous pouviez m'indiquer ce qui ne va pas et ce que je dois modifier, Merci d'avance



    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
    48
     
    //ma classe main
     
     
    public  void CaptureColonne() throws IOException {
     
    		CSVReader reader = new CSVReader(new FileReader(fichier), ';');
    		String [] nextLine;
    		String contenant = "";
     
    		List<Enregistrement> listeAvecDoublon = new ArrayList();
     
    		bw = new BufferedWriter(new FileWriter(cheminTF+"test.dbf", false));
    			 while ((nextLine = reader.readNext()) != null)
    			 	 {
     
    			 	  // Afficher les 5 bonnes colonnes
                   //System.out.println ("1 : "+nextLine[0] + " 2 : "+nextLine[1]+" 3 : "+nextLine[2]+" 6 : "+nextLine[5]+
                		  // " 7 : "+nextLine[6]);
                   contenant += nextLine[0] + ";"+nextLine[1]+";"+nextLine[2]+";"+nextLine[5]+
                		   ";"+nextLine[6]+";\n";
     
                   Enregistrement Eleve = new Enregistrement(nextLine[0],nextLine[1],nextLine[2],nextLine[5],nextLine[6]);
                   System.out.println("Eleve créé !");
                   listeAvecDoublon.add(Eleve);
    		    }
     
    			 reader.close();
    			 bw.write(contenant);
    			 bw.close();
    			 JOptionPane.showMessageDialog(null, "Génération terminée.","Terminé !", JOptionPane.INFORMATION_MESSAGE);
     
     
     
    			 Map<String,Map<String,List<Enregistrement>>> listeStructure = new HashMap<String,Map<String,List<Enregistrement>>>();
    			 for(Enregistrement ligne : listeAvecDoublon){
    				 if(listeStructure.get(ligne.getNom())== null){
    			 Map<String,List<Enregistrement>> prenomStructure = new  HashMap<String,List<Enregistrement>>();
    		        List<Enregistrement> listeDoublon = new ArrayList<Enregistrement>();
    		        listeDoublon.add(ligne);
    		        prenomStructure .put(ligne.getPrenom() ,listeDoublon);
    		        listeStructure.put(ligne.getNom(),prenomStructure );
    			 }else {
    			        listeStructure .get(ligne.getNom()).get(ligne.getPrenom()).add(ligne);
    			        System.out.println(ligne.getNom()+" "+ligne.getPrenom()+" est en doublon");
    			}}
     
    	}

    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
     
    //ma class enregistrement
     
    public class Enregistrement {
    		String Nom;
    		String Prenom;
    		String Niveau;
    		String CodeEcole;
    		String NomEcole;
     
    		public Enregistrement(String NomE, String PrenomE, String NiveauE, String CodeEcoleE, String NomEcoleE) {
     
    			Nom = NomE;
    			Prenom = PrenomE;
    			Niveau = NiveauE;
    			CodeEcole = CodeEcoleE;
    			NomEcole = NomEcoleE;
    		}
     
    		public String getNom() {
    		    return Nom;
    		  } 
     
    		public String getPrenom() {
    		    return Prenom;
    		  } 
     
    }

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

Discussions similaires

  1. [AC-2003] Gérer les doublons
    Par Malela dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 08/02/2012, 11h53
  2. Gérer les doublons
    Par annibva dans le forum Excel
    Réponses: 3
    Dernier message: 28/11/2010, 17h50
  3. Gérer les doublons avec SQL Loader
    Par _Remy_ dans le forum SQL
    Réponses: 1
    Dernier message: 18/12/2008, 16h05
  4. Gérer les Doublons sur 3 Colonnes
    Par faressam dans le forum Excel
    Réponses: 2
    Dernier message: 03/06/2008, 12h04

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