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

Java Discussion :

Parcourir un fichier texte deux fois


Sujet :

Java

  1. #1
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 123
    Par défaut Parcourir un fichier texte deux fois
    Bonjour,
    pouvez vous me dire comment je peux parcourir un fichier deux fois d'une façon optimale ?
    je m'explique par cet exemple :

    pour chaque ligne commençant par 'aaa' je dois chercher l'information 'zaza' dans les lignes commençant par zaza et ayant le meme num 152.
    fichier entrée :
    aaa bbb ccc 152 ppp
    aaa bbb ccc 153 ppp
    aaa bbb ccc 154 ppp
    zaz 152 zaza za za erez
    zaz 153 raya za za erez
    zaz 154 yaya za za erez
    fichier sortie :
    aaa bbb ccc 152 ppp zaza
    voila le code 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
     
    InputStream ips=new FileInputStream(path); 
    			InputStreamReader ipsr=new InputStreamReader(ips);
    			BufferedReader br=new BufferedReader(ipsr);
    			String ligne;
    			while ((ligne=br.readLine())!=null){
    				if(ligne.startsWith("aaa")){
    			//Recupere des information
    		num1 = ligne.substring(12,15);  //152
    					String ligne2 = null;
    					InputStreamReader ipsr2=new InputStreamReader(ips);
    					BufferedReader br2=new BufferedReader(ipsr2);
    					sortie:
    					while((ligne2 = br2.readLine())!=null){
    						String num2 = ligne2.substring(4,7);;
     
    						if(ligne2.startsWith("zaz") && num1.equals(num2)){
    				//erecuperer d'autres informations			
    						}
    					}
    mais mon code ne marche pas, il n'entre pas dans ma deuxieme boucle !
    Merci de votre aide.

  2. #2
    Membre émérite

    Homme Profil pro
    Architecte technique
    Inscrit en
    Juin 2005
    Messages
    588
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2005
    Messages : 588
    Par défaut
    Pourquoi 2 lectures ?

    Une HashMap doit être suffisant avec comme clé l'information commune.

    Pour chaque ligne commençant pas aaa ou zaz: création ou mise à jour de l'objet mis dans la map !!!

  3. #3
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 123
    Par défaut
    Mais comment j'ai pas pensé au HashMap !!!!!
    vraiment je cherche les problèmes

    Merci beaucoup Philippe Bastiani pour la réponse.

  4. #4
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 123
    Par défaut
    Bonjour,
    je relance ce sujet, car je rencontre un problème concernant l'utilisation de mon hashmap que j'ai construit à partir de mon fichier.
    avec un fichier de plus de 180000 lignes, j'ai environ 90 000 entrées dans mon hashmap, donc parcourir le hashmap prends beaucoup de temps.
    si quelqu'un a déjà rencontré ce problème prière de me dire comment je peux procéder pour que le traitement de mon hashmap soit rapide.

    Merci

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Par défaut
    Bonjour,
    Que mets-tu comme clés dans ta HashMap? Il est possible qu'il y est un problème lors du hashage de ta map.

    Et qu'entends-tu par long (1 seconde, quelques milliseconde?)

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    776
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 776
    Par défaut
    donc parcourir le hashmap prends beaucoup de temps.
    Heu qu'entend tu par parcourir la HashMap, tu n'utilises pas get() ?

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Par défaut
    si votre fichier est grand cela peut poser des probleme OUtOfMemoryError

  8. #8
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 123
    Par défaut
    Bonjour merci pour les réponses.
    voilà comment je parcous mon Hashmap :
    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
    for(String num : map.keySet()){
                if(mesContrats.contains(num)){
                    avenant = new Avenant();
                    avenant.setNumnum(StringUtils.trim(num));
                    List<String> lignes = map.get(num);
                    if(lignes.size()<2){
                        invalideAvenantNum.add(num);
                    }else{
                        for(String line : lignes){
                            if(line.startsWith(Constantes.CODE10)){
                                remplirInfos10(avenant, line);
                            }else if(line.startsWith(Constantes.CODE_11)){
                                remplirInfos110(avenant, line);
                            }
                        }
                        validavenant.add(avenant);
                        valideavenantNum.add(num);
                    }
     
                }else{
                    invalideavenantNum.add(num);
                }
            }
    pour le temps pris pour parcourir tout le map, il est de 10min !!

  9. #9
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 123
    Par défaut
    pour les méthodes remplirInfos10 et remplirInfos110, il ne font que setter les attributs de l'objet avenant en faisant des substring sur le string passé en paramètre.

    la lenteur ne peut pas être due au tests avec "contains", et les opérations de "substring" ?

  10. #10
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    Là ça vaut le coup de profiler pour savoir ce qui prend du temps. Voir aussi quel type de collection est "mesContrats", certaines sont plus rapides à l'insertion, d'autres pour parcourir...

  11. #11
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Je parcourais sur l'entrySet plutôt que le keySet ca fait gagner du temps, pas besoin d'interroger la map une nouvelle fois.

    C'est normal que tu trim après l'appel à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mesContrats.contains(num)
    ?

    mesContrats devrait être un HashSet ou alors utilise une ArrayList triée pour effectuer une recherche optimale.

    Un substring ne coûte rien dans la mesure où il ne fait aucune copie de caractères. Il ne fait que réutiliser le même tableau de caractère que la chaîne originale.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  12. #12
    Membre émérite

    Homme Profil pro
    Architecte technique
    Inscrit en
    Juin 2005
    Messages
    588
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2005
    Messages : 588
    Par défaut
    Si je comprends bien:
    -1- tu lis ton fichier et tu remplis ta map de lignes
    -2- tu parses ta map pour créer tes avenants

    => encore 2 traitements...

    Ta map devrait contenir tes contrats (cle=num entry=contrat. A la lecture de ton fichier:
    Pour chaque ligne
    => extraire le numéro de contrat
    => si mapContrat ne contient pas num
    => créer nouvel contrat et l'ajouter à la mapContrat
    => ajouter avenant au contrat.

    Autre point: as-tu besoin d'autant d'objets ? Je ne comprends pas pourquoi validAvenant n'est pas un attribut de l'objet Avenant...

  13. #13
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    776
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 776
    Par défaut
    Bonjour,

    Vu l'algo, c'est soit le contains soit les adds.
    Quel est le type exacte de mesContrats ?

    Eventuellement les adds si ta Hashmap est mal taillée, cela oblige peut-être java à la rehash souvent.
    Tu la construits avec les valeurs par défaut ?


    A confirmer avec un profiler.

  14. #14
    Membre éclairé
    Inscrit en
    Janvier 2011
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 51
    Par défaut
    Pourquoi ne pas lire le fichier ligne par ligne et écrire au fur et à mesure au lieu de passer par une hashmap?

  15. #15
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    Citation Envoyé par SamSer Voir le message
    Pourquoi ne pas lire le fichier ligne par ligne et écrire au fur et à mesure au lieu de passer par une hashmap?
    Il y a visiblement des recoupements à faire entre lignes. Cela implique de conserver les données extraites de certaines lignes pour comparaison.

  16. #16
    Membre éclairé
    Inscrit en
    Janvier 2011
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 51
    Par défaut
    Citation Envoyé par therwald Voir le message
    Il y a visiblement des recoupements à faire entre lignes. Cela implique de conserver les données extraites de certaines lignes pour comparaison.
    Ah oui, en effet. J'avais pas mes lunettes, on dirait!

Discussions similaires

  1. Réponses: 151
    Dernier message: 09/06/2007, 16h17
  2. [Tableaux] parcourir un fichier texte
    Par infotime dans le forum Langage
    Réponses: 2
    Dernier message: 25/05/2007, 12h56
  3. parcourir un fichier texte.
    Par gregb34 dans le forum Langage
    Réponses: 6
    Dernier message: 18/04/2006, 14h04
  4. Comment parcourir un fichier texte avec une boucle ?
    Par kikica dans le forum Langage
    Réponses: 2
    Dernier message: 15/11/2005, 18h13
  5. Réponses: 6
    Dernier message: 23/12/2003, 16h30

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