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

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Ardennes (Champagne Ardenne)

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

    Informations forums :
    Inscription : Janvier 2015
    Messages : 49
    Points : 24
    Points
    24
    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 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    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 211
    Points : 8 316
    Points
    8 316
    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 à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Ardennes (Champagne Ardenne)

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

    Informations forums :
    Inscription : Janvier 2015
    Messages : 49
    Points : 24
    Points
    24
    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 à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Ardennes (Champagne Ardenne)

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

    Informations forums :
    Inscription : Janvier 2015
    Messages : 49
    Points : 24
    Points
    24
    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 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    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 211
    Points : 8 316
    Points
    8 316
    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 à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Ardennes (Champagne Ardenne)

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

    Informations forums :
    Inscription : Janvier 2015
    Messages : 49
    Points : 24
    Points
    24
    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;
    		  } 
     
    }

  7. #7
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    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 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Du coup c'est cette ligne la qui pose problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     listeStructure .get(ligne.getNom()).get(ligne.getPrenom()).add(ligne);
    C'est dû au fait qu'il y a des doublons sur le nom mais pas sur le prénom.
    Du coup, il n'existe pas de liste sur le prénom. Car pas encore crée !

    il faut rajouter un test ! Il doit être du même style que le teste sur le nom. Un peu plus simple car tu as une map de moins à créer.

    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.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Ardennes (Champagne Ardenne)

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

    Informations forums :
    Inscription : Janvier 2015
    Messages : 49
    Points : 24
    Points
    24
    Par défaut
    Bonjour, après une semaine de grippe, je reprends mon code :

    kolodz : Je ne comprend pas pourquoi je dois rajouter une verif sur le prénom. je n'ai pas l'impression que ce soit ca le probleme, car le logiciel tourne pour les 3 premiers eleves mais il plante au 4e, et je n'en comprends pas la raison.
    l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Nom
    ABBAD
    ABDELAZIZ
    ABDELAZIZ
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    	at Main.CaptureColonne(Main.java:44)
    	at Main$2.actionPerformed(Main.java:109)
    	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)

    En fait j'ai encore du mal a comprendre ton code. Quelle est la ligne de code qui permet de savoir si la ligne est un doublon ? car quand je vois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(nomStructure.get(ligne.getNom())== null)
    {...}
    else {
    	  nomStructure .get(ligne.getNom()).get(ligne.getPrenom()).add(ligne);
    	  System.out.println(ligne.getNom()+" "+ligne.getPrenom()+" est en doublon");
    }
    je comprends que c'est cette simple verification qui comprend s'il y a un doublon ou non.


    De plus je viens de m'apercevoir que juste au dessus du code que tu m'as conseillé, j'ai fermer mon reader ( ligne 28 ), donc je me demandais ce qui permet encore la lecture de mon fichier.

    Cordialement.

  9. #9
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    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 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    De plus je viens de m'apercevoir que juste au dessus du code que tu m'as conseillé, j'ai fermer mon reader ( ligne 28 ), donc je me demandais ce qui permet encore la lecture de mon fichier.
    Quand tu lis ton fichier tu crée des objets en mémoire qui ont les informations de ton fichier (du moins une copie). Une fois ces objets crées, tu n'as plus besoin du fichier en lui-même.
    Imagine ton objet Enregistrement, comme une "fiche" avec des champ à remplir. Tu fois que tu as remplie l'ensemble des "fiches" avec ton fichier CSV. Tu n'as plus besoin du fichier, car chaque fiche porte aussi l'information.

    Pour le code, voici ce que tu dois avoir :

    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
    for(Enregistrement ligne : listeAvecDoublon){
    	// On prend le dossier de la famille
    	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 {
    		List<String,List<Enregistrement>> prenomStructure = listeStructure .get(ligne.getNom());
    		// On prend le dossier du prénom dans la famille.
    		if(prenomStructure.get(ligne.getPrenom()) == null){
    			List<Enregistrement> listeDoublon = new ArrayList<Enregistrement>();
    			listeDoublon.add(ligne);
    			prenomStructure .put(ligne.getPrenom() ,listeDoublon);
    		} else {
    			prenomStructure.get(ligne.getPrenom()).add(ligne);
    			System.out.println(ligne.getNom()+" "+ligne.getPrenom()+" est en doublon");
    		}
    	}
    }
    Imagine qu'une Map est une un dossier avec un nom ou tu range des choses à l'intérieur. Ici, tu as deux niveaux de dossier.

    Le premier niveau, c'est un dossier avec le nom de famille l'élevé, qui contient les dossiers de chaque élevés de cette famille.
    Le second niveau, c'est un dossier avec le prénom de l'élevé, qui contient chaque fiche que tu as remplis au début avec ton fichier CSV.

    Quand tu commence la boucle for, tu n'as qu'une pile de fiche avec aucune dossiers.
    Quand tu prend la premier fiche, tu va lire le nom de famille et voir que tu n'as pas de dossier associé.
    Tu crée donc un dossier avec le nom de famille dessus.
    Tu crée un dossier avec le prénom dessus.
    Tu mets la fiche de le dossier du prénom et le dossier du prénom dans celui du dossier de famille.

    Cas d'une sœur :
    Supposons que tu tombe sur la sœur du premier cas. Quand tu va lire le nom de famille tu va voir qu'il existe déjà un dossier pour cette famille. Cependant, il n'existe pas de dossier dans celui-ci pour le prénom de la sœur... Il faut donc que tu crée un dossier pour celle-ci et que tu range celui-ci dans le dossier de la famille.
    Note : C'est là où il y avait un problème, car dans le code que tu avais, on ne créait pas le dossier de la sœur (On supposait qu'il existait déjà, or ce n'est pas le cas.)

    Cas du doublon :

    Supposons qu'on retombe sur la même sœur, avec une seconde fiche. Quand tu lis le nom de famille, tu va retrouve le dossier correspondant.
    Quand tu va lire le prénom tu va trouve son dossier à elle. Tu sais donc que tu es dans le cas d'un doublon. Il y a déjà un dossier avec son prénom dans le dossier avec son nom de famille.
    Tu ajoute donc la fiche avec les fiches précédentes.

    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.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Ardennes (Champagne Ardenne)

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

    Informations forums :
    Inscription : Janvier 2015
    Messages : 49
    Points : 24
    Points
    24
    Par défaut
    Super, je sais pas si tu as une expérience dans le métier, mais tu devrais faire prof ^^
    Très bien expliqué, très bien imagé... vraiment je te remercie j'ai tout compris

  11. #11
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    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 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Merci,

    Je pense que dans quelques années, je chercherai à faire professeur en informatique. Pour le moment, je préfère faire plutôt enseigné.

    Pense à noter le sujet comme résolu si c'est le cas.

    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.

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Ardennes (Champagne Ardenne)

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

    Informations forums :
    Inscription : Janvier 2015
    Messages : 49
    Points : 24
    Points
    24
    Par défaut
    Bonjour. Je viens de trouver un nouveau bug dans mon programme. D'habitude j'utilisais un fichier d'eleves de 2010, aujourd'hui j'ai voulu essayer avec un csv de 2007. Alors que la structure est exactement la meme dans le 2007 et le 2010, le programme plante.
    J'ai donc fait plein de test pendant 1h, pour finalement m'apercevoir que le logiciel bug quand il y a plus de 1402 lignes
    et ce n'est pas la ligne 1402 qui a un probleme.
    Car si je test avec les lignes 500-1500 -> ca marche
    300-1500 -> ca marche
    0-1500 -> ca marche pas
    1500-3000 -> ca marche pas

    Et pourtant, le csv de 2010 possède + de 4000 lignes, et il marche sans probleme.

    voici l'erreur que la console affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils
    	at com.opencsv.CSVParser.isAllWhiteSpace(CSVParser.java:478)
    	at com.opencsv.CSVParser.parseLine(CSVParser.java:338)
    	at com.opencsv.CSVParser.parseLineMulti(CSVParser.java:270)
    	at com.opencsv.CSVReader.readNext(CSVReader.java:226)
    	at Main.CaptureColonne(Main.java:147)
    ...

  13. #13
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Je dirais qu'il y a une ligne vide, ou faite que de white spaces, entre 0 et 300, et entre 1500 et 3000, et qu'il manque le jar de Apache Commons Lang dans ton classpath.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  14. #14
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Ardennes (Champagne Ardenne)

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

    Informations forums :
    Inscription : Janvier 2015
    Messages : 49
    Points : 24
    Points
    24
    Par défaut
    non il n'y a aucune ligne vide ni de whitespace dans mon fichier.
    C'est juste a partir de 1402 lignes.
    0-1402 ca marche
    0-1403 ca marche pas
    1402-1410 ca marche
    juste la ligne 1403 ca marche
    juste la ligne 1402 ca marche

    Je commence a pété les plombs ^^

    EDIT : J'AI TROUVEEEEEEEEEE


    Mon probleme etait dans le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CSVReader reader = new CSVReader(new FileReader(fichier), ';','?',1);
    je ne savais pas a quoi correspond l'avant dernier parametre, donc j'avais mis un "?" pensant qu'il n'y en avait pas dans le csv, puis je me suis apercu qu'il y en avait un a la ligne 1403.j'ai donc remplacer le "?" de l'avant dernier parametre par un "$" et ca marche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CSVReader reader = new CSVReader(new FileReader(fichier), ';','$',1);
    Du coup j'aimerais bien savoir a quoi sert ce parametre ( je sais que c'est le caractere d'echapement, mais qu'est ce ?), et si il est possible de ne pas le mettre, sachant que j'ai besoin du dernier parametre

  15. #15
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Peu importe, dans la méthode isAllWhiteSpace() CSVParser, l'API de CSVReader à besoin d'une classe de l'API Apache commons._

    Un caractère d'échappement, c'est un caractère qui permet de désactiver pour le caractère qui suit la signification "spéciale" du caractère suivant : comme le \ qu'on met devant un " entre " en Java. Donc, pour CSVReader, je suppose que c'est le caractère qu'on dit vouloir utiliser pour "échapper" les caractères de séparations (les point-virgules à priori). En général, on utilise \. Sauf s'il y a des \ non doublés dans tes données. Trouve un caractère non utilisé pour l'encoding utilisé et tu n'auras pas de problème.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  16. #16
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Ardennes (Champagne Ardenne)

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

    Informations forums :
    Inscription : Janvier 2015
    Messages : 49
    Points : 24
    Points
    24
    Par défaut
    D'accord merci.
    J'ai essayer de mettre "\" en parametre mais eclipse me dit qu'il faut mettre un caractere différent de celui la ..

  17. #17
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Justement parce \ est le caractère d'échappement en Java, donc il faut le doubler, pour dire qu'on veut ce caractère (et pas échapper le suivant) : "\\"
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

+ 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