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

Entrée/Sortie Java Discussion :

Programme d'extraction de donnée d'un fichier texte


Sujet :

Entrée/Sortie Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Licence RGI
    Inscrit en
    Septembre 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Licence RGI

    Informations forums :
    Inscription : Septembre 2016
    Messages : 39
    Points : 14
    Points
    14
    Par défaut Programme d'extraction de donnée d'un fichier texte
    Bonjour tout le monde.

    Je viens demander de l'aide pour mon programme qui consiste à extraire certaines données d'un fichier .txt et d'en afficher le resultat.
    Ceci dit il est possible que je rencontre 2 types de fichiers .txt ( Un fichier qui est deja ligne par ligne ou un fichier en streaming c'est à dire en un seul pâté pour être clair).

    Mon programme doit donc dans un 1er temps lire le fichier, jusque la je n'ai pas de pb
    Ensuite mon programme devrait pouvoir compter le nombre de caractère de fin de ligne de mon fichier (pour les données présente dans mon fichier les fins de lignes sont représentée par des " ' ").
    Si le nombre de " ' " est supérieur à 1 c'est donc un fichier déjà en ligne par ligne.
    Si le nombre de " ' " est inférieur ou égal à 1 c'est donc un fichier streaming et je dois donc remplacer mes " ' " par des "/n" pour le remettre en ligne par ligne.

    Une fois le fichier dans le bon format je dois extraire certaines infos mais cette partie du programme est déjà opérationelle.

    Je vous demande de l'aide car je debute en java et a force de chercher et d'essayer de nouvelles choses vu à droite à gauche je me retrouve face a mon programme totalement pommé sans savoir exactement ou j'en suis et si je ne fais pas du grand n'importe quoi.
    Je vous demande donc d'être indulgent et si possible de ne pas être hyper technique dans vos explications de façon à ce que je comprenne , je rappelle que je suis debutant

    Pour résumer : J'arrive à lire mon fichier, j'arrive à extraire les infos QUE lorsque le fichier est deja en ligne par ligne
    Je n'arrive pas à compter mes " ' " marquant la fin de ligne dans mon fichier .txt ce qui ne me permet pas non plus de determiner quel type de fichier arrive en entrée.
    Mon programme ne rentre pas dans la boucle (de comptage des " ' ") mon compteur ne s'incrémente donc pas et le resultat des retour à la ligne est toujours égal à 0!

    Je precise qu'à cette heure mon programme est en desordre il y a des choses que je ne saisie pas car à force de prendre des bouts de programme un peu partout je suis PERDU!

    Merci d'avance pour le temps que vous m'accorderez messieurs et pardon au As du java pour vos yeux en voyant mon code ci-dessous

    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
    49
    50
     
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    import java.util.StringTokenizer;
     
    public class ProgExtLIN {
     
                 private static String readLine() {
                                            // TODO Auto-generated method stub
                                            return null;
                               }
     
                 public static void main(String[] args) {
     
     
                 readFile("C:/monfichier.txt");    // Lecture fichier
                 int compt = 0;
                 String Line =null;
     
                 while((Line = readLine()) !=null){
                              StringTokenizer st= new StringTokenizer(Line);
     
                                        while(st.hasMoreTokens()){
                                                      System.out.println("incrémentation");
                                                         if(st.nextToken().equals("'")){
                                                                      compt++;
                                                         }
                                            }
            }System.out.println(compt+ " retour à la ligne dans ce fichier"); 
                                return;
                 }
     
     
        private static BufferedReader reader;
        public static void readFile(String pathToFile){
     
     try{ 
                              reader = new BufferedReader(new FileReader(new File(pathToFile)));
                              String ligne;
     
                              while((ligne = reader.readLine()) != null){
                                            if(ligne.startsWith("LIN+")){
                                                         System.out.println(ligne);
                                                }
                              } 
                 } catch (Exception ex){
                              System.err.println("Error. "+ex.getMessage());
             } System.out.println("Fin de l'extraction");
        }

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2011
    Messages : 584
    Points : 181
    Points
    181
    Par défaut
    Bonjour,
    je pense que le plus simple serait d'utiliser un BufferedReader, et d'ajouter un compteur de ligne :

    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
    public static void main(String args[]) {
            BufferedReader reader = null;
            int nbLigne = 0;
     
            try {
                reader = new BufferedReader(new FileReader("tonFichier.txt"));
                String line = reader.readLine();
     
                while (line!=null) {
                    nbLigne ++;
                    System.out.println(line);
                    line = reader.readLine();
                }
     
            } catch (IOException ioe) {
                System.out.println(ioe.getMessage());
            } finally {
                try { if (reader!=null) reader.close(); } catch (Exception e) {}
            }
     
           if (nbLigne >1) {
                 // tu es dans un fichier ligne a ligne
          } else {
             // tu es en streaming  ou dans un fichier ligne a ligne qui ne contient qu'une seule ligne
         }
        }

  3. #3
    Membre à l'essai
    Homme Profil pro
    Licence RGI
    Inscrit en
    Septembre 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Licence RGI

    Informations forums :
    Inscription : Septembre 2016
    Messages : 39
    Points : 14
    Points
    14
    Par défaut
    Déjà merci beaucoup pour la réactivité!

    Cela fonctionne parfaitement j'ai éssayé avec plusieurs fichiers tout va bien, me reste à remplacer les " ' " par des "\n" et le tour est joué. C'est une chose simple mais pour moi c'est compliqué je laisse donc le sujet ouvert au cas ou je rencontre d'autres soucis.

    Merci encore!

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2011
    Messages : 584
    Points : 181
    Points
    181
    Par défaut
    Pour remplacer des caractères, tu peux utiliser la fonction replace.
    Mais il faut être sur que tes fichier ne contiennent pas d'apostrophe, car sinon une phrase banale du genre "l'éléphant est un animal" sera modifiée.

    Pour utiliser le fonction, tu peux donc pour chaque ligne lu, remplacer toutes les occurences d'un caractère par un autre :

    line = line.replace('\'', '\n');
    En java les caractères spéciaux doivent être échappés par des \

    Voila, bon courage à toi

  5. #5
    Membre à l'essai
    Homme Profil pro
    Licence RGI
    Inscrit en
    Septembre 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Licence RGI

    Informations forums :
    Inscription : Septembre 2016
    Messages : 39
    Points : 14
    Points
    14
    Par défaut
    Effectivement je peux retrouver d'autres " ' " ne voulant pas indiquer une fin de ligne merci du conseil! Ceci dit dans mon fichier dans le cas ou " ' " n'indique pas une fin de ligne ce caractère est précédé d"un " ? " il faut donc que je test le caractère precedent " ' " pour verifier si le " ? " s'y trouve et si cela indique ou non une fin de ligne. Voila je vais galerer mais en tout cas j'avance c'est le principal ^^

    Merci encore!

  6. #6
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2011
    Messages : 584
    Points : 181
    Points
    181
    Par défaut
    Dans cas, il faut récupérer les index des apostrophes, pour récupérer le caractères précédent.
    il vaut mieux faire une nouvelle fonction pour que le code soit lisible. Personnellement je ferait une fonction qui prend une ligne en paramètre.
    Mais je pense qu'il va falloir faire une lecture caractère par caractère.

    Ou sinon voir du coté des regex, mais c'est plus compliqué pour un débutant.
    Je te laisse chercher un petit coup, et si tu trouve pas, je te donnerai la solution

  7. #7
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2011
    Messages : 584
    Points : 181
    Points
    181
    Par défaut
    Bon en fait, pour débuter l'algo est pas simple à trouver, donc je vais t'aider
    J'ai fait une fonction qui prend en paramètre la ligne à transformer, le caractère qu'on cherche à remplacer (ici le \'), le caractère de remplacement ('\n'), et le caractère de sécurité ('?');
    Ainsi si un jour tu dois modifier un des caractères se sera simple à mettre en place
    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
    /**
             * 
             * @param line La ligne a traiter
             * @param charToReplace Le caractere qu'on cherche a remplacer
             * @param newChar Le nouveau caractere
             * @param charBefore La caractere indiquant qu'on est au milieu d'une ligne
             * @return
             */
    	private static String replaceChar(String line, char charToReplace, char newChar, char charBefore) {
    		String newLine = "" + line.charAt(0);
    		// i commence a 1 car le premier caractere ne doit pas etre remplace		
    		for (int i = 1; i < line.length(); i++) {
    			if ( line.charAt(i) == charToReplace) {
    				if (line.charAt(i-1) == charBefore) {
    					newLine += "" +  line.charAt(i);
    				} else {
    					newLine += "" + newChar;
    				}
    			} else {
    				newLine += "" +  line.charAt(i);
    			}
    		}
     
    		return newLine;
    	}
    Il doit y avoir plus simple en réfléchissant un peu, mais ça devrait fonctionner

  8. #8
    Membre à l'essai
    Homme Profil pro
    Licence RGI
    Inscrit en
    Septembre 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Licence RGI

    Informations forums :
    Inscription : Septembre 2016
    Messages : 39
    Points : 14
    Points
    14
    Par défaut
    J'aurais jamais trouvé cette solution seul c'est sûr!

    Merci d'avoir pris le temps de réfléchir à mon problème, je vais bien analyser la fonction que tu viens d'envoyer car pour le moment j'ai du mal à tout saisir avec précision et je veux pas copier/coller bêtement sans comprendre ce qu'il s'y passe.

  9. #9
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2011
    Messages : 584
    Points : 181
    Points
    181
    Par défaut
    L'algo est un peu complexe, parce qu'il prend plusieurs paramètres.
    Mais il consiste a parcourir la ligne caractère par caractère.
    La boucle for commence a 1, car on sait qu'on ne va pas remplacer le premier caractère.
    Après, je construis une nouvelle ligne pendant le parcours.

    Si je trouve un caractère différent de \', je l'ajoute a ma nouvelle ligne
    Si je trouve un \' alors on a deux possibilités :
    1 - le caractère d'avant est un ?, donc on modifie rien, j'ajoute donc le \' a ma nouvelle ligne
    2 - le caractère d'avant n'est pas un ?, j'ajoute donc un \n a la nouvelle ligne

    Voila j'espère que ça t'aidera à mieux comprendre

  10. #10
    Membre à l'essai
    Homme Profil pro
    Licence RGI
    Inscrit en
    Septembre 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Licence RGI

    Informations forums :
    Inscription : Septembre 2016
    Messages : 39
    Points : 14
    Points
    14
    Par défaut
    Super! Ça m'aide énormément Des petits détails qu'on juge pas utile de préciser quand on a un bon niveau mais pour des débutants ça peut tout changer dans la compréhension. J'avance doucement bon j'ai tout un tas de questions que je pose pas parce qu'il faut faire ses propres recherches mais en tout cas tous les éléments que tu m'as donné ont été très utile. Quand tout sera opérationnel je posterai le résultat! Gracias

  11. #11
    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
    Citation Envoyé par Bebuck Voir le message
    Bon en fait, pour débuter l'algo est pas simple à trouver, donc je vais t'aider
    J'ai fait une fonction qui prend en paramètre la ligne à transformer, le caractère qu'on cherche à remplacer (ici le \'), le caractère de remplacement ('\n'), et le caractère de sécurité ('?');
    Ainsi si un jour tu dois modifier un des caractères se sera simple à mettre en place
    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
    /**
             * 
             * @param line La ligne a traiter
             * @param charToReplace Le caractere qu'on cherche a remplacer
             * @param newChar Le nouveau caractere
             * @param charBefore La caractere indiquant qu'on est au milieu d'une ligne
             * @return
             */
    	private static String replaceChar(String line, char charToReplace, char newChar, char charBefore) {
    		String newLine = "" + line.charAt(0);
    		// i commence a 1 car le premier caractere ne doit pas etre remplace		
    		for (int i = 1; i < line.length(); i++) {
    			if ( line.charAt(i) == charToReplace) {
    				if (line.charAt(i-1) == charBefore) {
    					newLine += "" +  line.charAt(i);
    				} else {
    					newLine += "" + newChar;
    				}
    			} else {
    				newLine += "" +  line.charAt(i);
    			}
    		}
     
    		return newLine;
    	}
    Il doit y avoir plus simple en réfléchissant un peu, mais ça devrait fonctionner
    Ne pas faire de concaténation dans une boucle. Préférez l'utilisation d'un StringBuilder (d'autant plus que ton ""+char ne sert à rien newLine += line.charAt(i)) fonctionne très bien)) :

    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
    	private static String replaceChar(String line, char charToReplace, char newChar, char charBefore) {
    		StringBuilder newLine = new StringBuilder(line.charAt(0));
    		// i commence a 1 car le premier caractere ne doit pas etre remplace		
    		for (int i = 1; i < line.length(); i++) {
    			if ( line.charAt(i) == charToReplace) {
    				if (line.charAt(i-1) == charBefore) {
    					newLine.append(line.charAt(i));
    				} else {
    					newLine.append( newChar);
    				}
    			} else {
    				newLine.append( line.charAt(i) );
    			}
    		}
     
    		return newLine.toString();
    	}
    Dans l'hypothèse on ne veut pas utiliser une regexp (line.replaceAll("(?<!"+charBefore+")" + charToReplace, ""+newChar)), bien sûr.
    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.

  12. #12
    Membre à l'essai
    Homme Profil pro
    Licence RGI
    Inscrit en
    Septembre 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Licence RGI

    Informations forums :
    Inscription : Septembre 2016
    Messages : 39
    Points : 14
    Points
    14
    Par défaut
    Bonjour messieurs,
    Je suis de retour sur mon programme et ses problèmes ^^ vos solutions m'ont bien aidés mais je me retrouve de nouveau face à un probleme dont je ne trouve pas la solution.

    Problème:
    J'ai un fichier en streaming, que j'arrive à mettre au format voulu (c'est à dire en ligne/ligne). Ensuite lorsque le fichier est au bon format je dois extraire des données ( toutes les lignes commencant par "ARD"), ceci dit le programme n'arrive pas à extraire les "ARD"et ne rentre pas dans la boucle d'extraction. Je fais tout un tas de test en prenant d'autres choses dans mon fichier et je remarque que le programme rentre dans la boucle "d'extraction" seulement quand je rechercher un "UNA" plutôt que mon "ARD" (la signification des acronymes n'a aucune importance ce sont juste les 3 caractères recherchés qui representent une donnée..).
    J'utilise des system.out.print("...") afin de voir si le programme rentre ou non dans mes boucles.

    Voici un extrait de mon fichier :

    UNA:+.? 'UNB+UNOA:1+NFI0000:AA+0055982:AA+160723:0950+18'UNH+1+DELINS:3:0:OD:INTESA++1'MID+1620509403004+160723:0940'SDT+094000738110550::05100 - TERNI:00982++++IT'BDT+000780013:FCA ITALY S.P.A.:C.SO AGNELLI 200:::10135 - TORINO - TO'ARI++160723:160806+3'CSG+:AGAP MANUFACTURING 10095:VIA SAN PAOLO N. 67/71 INGR.1:197++0004163:MRF 10135:CORSO, 75:::TORINO+IT'ARD+067090890::TUBAZIONE DI SCARICOCENTR.::T::99+CE+00055982'

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    import java.io.IOException;
     
    //------------------------Lecture du fichier + valeur nombre de ligne (Tout est OK)-------------------//
     
    public class test {
    	static String pathToFile = "C:/Users/1cambien/Desktop/Test/File2.txt";
     
     
    	public static void main(String args[]) throws IOException {
            BufferedReader reader = null;
            int nbLigne = 0;
     
            try {
                reader = new BufferedReader(new FileReader(pathToFile));
                String line = reader.readLine();
     
                while (line!=null) {
                    nbLigne ++;
                    System.out.println(line);
                    line = reader.readLine();
     
                }
     
            } catch (IOException ioe) {
                System.out.println(ioe.getMessage());
              } finally {
            	  		try { 
            	  			if (reader!=null) reader.close(); 
            	  		}catch (Exception e) {}
                }
     
    //------------------------------------2e Partie: Fichier ligne/ligne OU streaming---------------------------------------------//
     
     if(nbLigne>1){
        System.out.println("Le fichier est au bon format\n"); // Reste à extraire nos LIN+ (ou ARD pour File2.txt mais à voir plus tard)
     
        	try { System.out.println("Extraction des données :");
                reader = new BufferedReader(new FileReader(new File(pathToFile)));
                String ligne;
     
                while((ligne = reader.readLine()) != null){
     
                    if(ligne.startsWith("LIN+")){
                        System.out.println(ligne);
     
                    }
                }System.out.println("Fin de l'extraction");
            } catch (Exception ex){
                System.err.println("Error. "+ex.getMessage());
            }
        }
     
     
    	else{ //----------------------------------------------------Passer de streaming à ligne/ligne & extraction des données
    		reader = new BufferedReader(new FileReader(new File(pathToFile)));
    		System.out.println("Conversion du fichier au bon format");
    		String line = reader.readLine();
    		line=line.replaceAll("\'","\n");
    		System.out.print(line);
    		System.out.println("Conversion du fichier OK \n");
     
    		try { 
            reader = new BufferedReader(new FileReader(new File(pathToFile)));
            System.out.println("Extraction des données1 :");
            	while((line = reader.readLine()) != null){
     
            		if(line.startsWith("ARD")){
            			System.out.println(line);
            			System.out.println("Extraction des données3 :");
            		}
    	        }System.out.println("Fin de l'extraction");
    	    } catch (Exception ex){
    	        	System.err.println("Error. "+ex.getMessage());
    	      }
           }
        } 	
     }

  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,

    Premièrement, tu ne fais que lire le fichier, donc tous tes replace, ou autre modification, extraction, etc, n'ont strictement aucun effet sur le traitement suivant. Pourquoi lire le fichier autant de fois, on peut très bien le lire en une fois et faire tout les traitements que tu fais, en une boucle de lecture (plus une d'analyse pour le cas ARD), sauf éventuellement pour le comptage (sauf que, on va le voir, ça me semble superflu)

    Ton algo général, c'est dire :

    Si le fichier fait plus d'une ligne (soit 2, 3, 4...), alors tu fais un traitement qui sélectionne les lignes qui commence par LIN+ (qui consiste juste à afficher ces lignes).
    Sinon (c'est à dire si le fichier fait 0 ou 1 ligne), alors tu remplaces les quotes par \n, et tu affiche les lignes obtenues si le fichier fait une ligne (ou rien), puis tu relis le fichier, et tu cherches les lignes qui commencent par "" (donc toutes les lignes, donc soit 0 ligne soit 1 ligne). Si tu cherches les lignes qui commence par UNA, tu la trouves bien parce que ton fichier commence par UNA, mais on ne trouvera jamais de ligne commençant par ARD.

    Pour compter, on peut s'arrêter dès qu'on a trouvé au moins 2 lignes (c'est la condition suffisament discriminante), ce qui ira déjà plus vite.
    Question : une fichier est-il gros (des milliers de lignes ?) ou pas ? S'il ne l'est pas on pourrait simplement le lire en une fois par Files.readAllLines() et travailler sur les lignes en mémoire.

    Accessoirement, tu ne fermes jamais tes flux !

    Voilà comment il faudrait faire :

    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
    public static void main(String args[]) throws IOException {
     
    		final String word="ARD";
     
    		Path path = Paths.get(pathToFile);
     
    		int nb = 0;
    		try(BufferedReader reader = Files.newBufferedReader(path)) {
    			for(String line = reader.readLine(); line!=null; line = reader.readLine()) {
    				nb++; // on compte
    				if ( nb>1 ) break; // inutile de lire plus loin
    			}
    		}
     
    		try(BufferedReader reader = Files.newBufferedReader(path)) { 
    			for(String line = reader.readLine(); line!=null; line = reader.readLine()) {
    				if ( nb>1 ) { // s'il y a plus d'une ligne on traite les lignes qui commencent par LIN+
    					if ( line.startsWith("LIN+") ) { // si on commence par LIN+, on affiche ça
    						extraire(line);
    					}
    				}
    				else {
    					convertir(line, word);
    				} 
    			}
    		}
     
    	}
     
     
    	private static void convertir(String file, String word) {
    		for(String line : file.split("'") ) { // on découpe par rapport à ', inutile de convertir en ligne pour parser des lignes (comme on a forcément qu'une ligne au plus, il n'y a aucun séparateur de ligne)
    			if ( line.startsWith(word) ) {
    				System.out.println(line);
    			}
    		}
    	}
     
     
    	private static void extraire(String line) {
    		System.out.println(line);
    	}
    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
    Licence RGI
    Inscrit en
    Septembre 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Licence RGI

    Informations forums :
    Inscription : Septembre 2016
    Messages : 39
    Points : 14
    Points
    14
    Par défaut
    Après reflexion je pense que lorsque que je souhaite extraire mes données après que le fichier soit passé en ligne par ligne, au moment de l'extraction le programme se base sur le fichier de base et non celui qui vient d'etre passé en ligne par ligne ce qui fait qu'il ne detecte pas les lignes et ne detecte jamais mes "ARD".. et pour "UNA" cela fonctionne car c'est le debut du fichier et ça ne peut fonctionner QUE pour lui.
    Je vais donc devoir trouver une solution pour que le programme prenne en compte le fichier converti et non celui de base. Je pense devoir stocker en memoire mon fichier et l'appeler au moment de l'extraction. Reste à savoir comment faire ^^

  15. #15
    Membre à l'essai
    Homme Profil pro
    Licence RGI
    Inscrit en
    Septembre 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Licence RGI

    Informations forums :
    Inscription : Septembre 2016
    Messages : 39
    Points : 14
    Points
    14
    Par défaut
    D'accord merci Joel pour ton temps et tes infos

    Je rappelle que je suis vraiement une M**** en java j'ai commencé le 5/09/16 donc ça ne m'etonne pas quand tu dis que je ferme jamais mes flux ou que je fais des choses inutiles, c'est que je ne le remarque pas et j'ai encore beaucoup de mal à voir si des choses de mon programmes sont stupides ou non aha
    En tout cas merci je vais voir avec les programme que tu as envoyé.

  16. #16
    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
    Citation Envoyé par Danoob80 Voir le message
    Après reflexion je pense que lorsque que je souhaite extraire mes données après que le fichier soit passé en ligne par ligne, au moment de l'extraction le programme se base sur le fichier de base et non celui qui vient d'etre passé en ligne par ligne ce qui fait qu'il ne detecte pas les lignes et ne detecte jamais mes "ARD".. et pour "UNA" cela fonctionne car c'est le debut du fichier et ça ne peut fonctionner QUE pour lui.
    C'est bien ce que j'ai dit
    Citation Envoyé par Danoob80 Voir le message
    Je vais donc devoir trouver une solution pour que le programme prenne en compte le fichier converti et non celui de base. Je pense devoir stocker en memoire mon fichier et l'appeler au moment de l'extraction. Reste à savoir comment faire ^^
    Je te la donne la solution. Sinon, tu peux aussi créer un fichier sur le disque, et le relire.
    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.

  17. #17
    Membre à l'essai
    Homme Profil pro
    Licence RGI
    Inscrit en
    Septembre 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Licence RGI

    Informations forums :
    Inscription : Septembre 2016
    Messages : 39
    Points : 14
    Points
    14
    Par défaut
    Oui pardon c'est pcq j'ecrivais mon message pendant que tu as posté ton message.

  18. #18
    Membre à l'essai
    Homme Profil pro
    Licence RGI
    Inscrit en
    Septembre 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Licence RGI

    Informations forums :
    Inscription : Septembre 2016
    Messages : 39
    Points : 14
    Points
    14
    Par défaut
    Super ça marche très bien encore merci!
    Ca me dégoute de galérer comme ça sur mon petit programme bidon alors qu'en 5min vous trouvez la solution ^^
    Super forum en tout cas, j'ai toujours eu des reponses rapides, precises et qui m'ont toujours aide à avancer.

  19. #19
    Membre à l'essai
    Homme Profil pro
    Licence RGI
    Inscrit en
    Septembre 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Licence RGI

    Informations forums :
    Inscription : Septembre 2016
    Messages : 39
    Points : 14
    Points
    14
    Par défaut
    La 1ere étape de mon programme fonctionne parfaitement merci encore, pour rappel elle consitait à extraire une donnée precise d'un fichier, et si ce fichier etait en streaming(gros paquet) il fallait le remettre en ligne/ligne et ensuite extraire la donnée. Maintenant une difficulté vient s'ajouter car je dois maintenant offrir la possibilité d'extraire 2 type de donnée (ex : les LIN + les RFF ).
    Voici l'exemple du contenu d'un fichier :

    LIN++38+989868ZP:IN'IMD+++:::JEU SIEG MELTEME'RFF+ON:8718685'SCC+4'QTY+113:3:PCE'DTM+63:20122359:203'DTM+64:2016000:203'RFF+MH:664388'RFF+MH:6K355'RFF+MH:6K3008[/B]'SCC+4'QTY+113:14:PCE'DTM+63:202359:203'DTM+64:201230000:203'RFF+MH:665054'RFF+MH:6K37031'RFF+MH:667724'RFF+MH:6K367725'RFF+MH:669586'RFF+MH:670097'RFF+MH:670098'RFF+MH:671148'RFF+MH:62188'RFF+MH:672190'RFF+MH:672744'

    Dans mon fichier cette partie (segment) se répète un grand nombre de fois.
    L'objectif est d'extraire en 1er le LIN et d'extraire les RFF qui sont associés à ce LIN.
    La repetition de ces segments sera donc délimité par les LIN. Le LIN suivant marquera la fin du 1er bloc LIN. Une dernière petite chose, tout ce qui ne concerne pas LIN ou RFF ne doit pas apparaitre dans notre extraction.

    Ex du resultat souhaité :
    LINa...... RFFaa....... RFFab....... RFFac......
    LINb...... RFFba....... RFFbb....... RFFbc......
    LINc...... RFFca....... RFFcb........ RFFcc......

    J'ai essayé pleins de choses me menant à rien je me tourne donc vers vous afin que vous puissiez m'apporter de l'aide.
    Voici mon programme à l'heure actuelle :
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    public class test {
     
    		public static void main(String args[]) throws IOException {
     
    			System.out.println("Choix fichier :");
    			Scanner sc = new Scanner(System.in);
    			String str = sc.nextLine();
     
     
    			System.out.println("Saisissez une donnée :");
    			Scanner sc1 = new Scanner(System.in);
    			String str1 = sc1.nextLine();
     
     
    			System.out.println("Souhaitez vous extraire une 2nd donnée : o/n");
    			Scanner sc2 = new Scanner(System.in);
    			String str2 = sc2.nextLine();
     
     
    			if(str2 != "non"){																		
    				System.out.println("Laquelle ?");
    				Scanner sc3 = new Scanner(System.in);
    				String str3 = sc3.nextLine();
    				System.out.println("Extraction demandé :" +str1+ " / " +str3);
    				sc3.close();
    			}
    			sc.close();
    			sc1.close();
    			sc2.close();
     
     
    				final String word = str;
     
    				String pathToFile = "C:/Users/1cambien/Desktop/Test/"+str+".txt";
    				Path path = Paths.get(pathToFile);
     
    				int nb = 0;
    				try(BufferedReader reader = Files.newBufferedReader(path)) {
    					for(String line = reader.readLine(); line!=null; line = reader.readLine()) {
    						nb++; 																			// on compte
    						if ( nb>1 ) break; 																// inutile de lire plus loin
     
    					}
    				}
     
     
    				try(BufferedReader reader = Files.newBufferedReader(path)) { 
    					for(String line = reader.readLine(); line!=null; line = reader.readLine()) {
    						if ( nb>1 ) {   // si nb> on traite les lignes qui commencent par "word"																
    							if ( line.startsWith(word) ) { // si start par "word",on affiche 		
    								extraire(line);
    								System.out.println("Extraction");
    							}
    						}
     
    						else {
    							convertir(line, word);
    						} 
    					}
    				}		 
    		}
     
     
    			private static void convertir(String file, String word) {
    				for(String line : file.split("'") ) { 
    					if ( line.startsWith(word)) {
    						System.out.println(line);
    					}
    				}
    			}
     
     
    			private static void extraire(String line) {
    				System.out.println(line);
    			}
     
    	    }
    Je n'ai AUCUNE idée de la façon dont je dois m'y prendre pour qu'un nouveau parametre d'extraction soit ajouté à mon programme. Ce qu'on me demande est bien au dela de mes competences car je suis dans le java depuis peu et je suis dans le néant ^^ je pense qu'il faut un certain niveau pour ce genre de programme. Je n'attends pas un code déjà tout fait mais si il y a des pistes cela me sera TRES utile :) PS : niveau de dev très bas donc merci d'être précis et pas trop technique dans vos explications aha! Merci d'avance pour votre précieux temps messieurs!!

  20. #20
    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
    En partant du principe que ta partie de fichier commençant par LIN+ est sur une ligne, tu cherches toutes les positions de RFF entre une position de LIN+ et sa suivante.
    Ou, autrement dit, tu cherches des chaînes commençant par LIN+ et allant jusqu'au LIN+ suivant, puis dans chacune d'entre-elles, les positions des différents RFF.

    On peut obtenir la position d'une chaîne dans une autre avec la méthode indexOf() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int position = chaine.indexOf("LIN+");
    position contient la première position de "LIN+" dans chaine, ou -1 si "LIN+" ne s'y trouve pas.
    On peut aussi obtenir la position d'une chaîne dans une autre, à partir d'une position :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int position = chaine.indexOf("LIN+", 1);
    position contient la première position de "LIN+" dans chaine à partir du caractère de position 1, ou -1 si "LIN+" ne s'y trouve pas.

    On va appeler startLin la position de LIN+, endLin la position du LIN+ après startLin.
    On commence par startLin=chaine.indefOf("LIN+"). Pour obtenir le suivant, on va écrire chaine.indexOf("LIN+",startLin+1). On fait +1 à startLin, sinon on obtiendrait forcément startLin (si on cherche LIN+ à partir d'un caractère qui commence déjà un LIN+, on va trouver le même forcément).
    On va boucler pour traiter chaque LIN+, en faisant à la fin de l'itération, startLin=endLin pour recommencer le même process à partir du LIN+ suivant celui qu'on vient de traiter.
    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
    for (int startLin = chaine.indexOf("LIN+"); startLin>=0 && startLin<chaine.length(); ) { // on commence donc sur la première position de LIN+, et on bouclke tant qu'on a un starLin situé dans la chaîne à traiter
         int endLin = chaine.indexOf("LIN+", startLin+1); // on cherche le suivant
         if (endLin<0 ) { // il n'y a pas de suivant...
             endLin = chaine.length(); // on va traiter la fin de la chaîne
         }
         // on a ici un début de chaîne et une fin de chaîne :
     
         // on peut simplifier le traitement en faisant une nouvelle chaîne (on peut s'en passer, mais c'est juste un peu plus complexe au niveau des tests) :
     
         String chaineLin = chaine.substring( startLin, endLin); // on pourrait supprimer le LIN+ du début en écrivant chaine.substring( startLin + "LIN+".length(), endLin ), mais comme "RFF" n'est pas contenu dans "LIN+", ce n'est pas indispensable, et c'est plus simple de dire qu'on commence à startLin et termine à endLin.
     
          // maintenant tu peux chercher la position de RFF dans chainLin, avec exactement la même méthode (avec String.indexOf())
     
         startLin = endLin; // on reboucle sur le LIN+ de fin (à la toute fin de la chaîne, comme endLin vaut chaine.length(), startLin va valloir chaine.length() et, donc, on va sortir de la boucle (la condition du while sera fauss)
    }
    Si ta chaîne est composée de plusieurs lignes, il faudrait savoir si on peut avoir des LIN+ à cheval sur plusieurs lignes, des RFF à cheval sur plusieurs lignes, etc.
    Sinon le plus simple est de les regrouper en une seule, pour appliquer la méthode vu ci-avant. On peut le faire sans, mais c'est pareil que dit précédemment, les conditions de boucle, et les manipulations sur endLin plus complexes.
    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.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Extraction des données d'un fichier text en vb net
    Par sihammaster dans le forum VB.NET
    Réponses: 5
    Dernier message: 29/11/2009, 15h37
  2. Extraction de données d'un fichier texte
    Par boobz dans le forum Langage
    Réponses: 1
    Dernier message: 30/03/2008, 11h40
  3. Réponses: 4
    Dernier message: 05/02/2008, 11h08
  4. Extraction de données dans un fichier texte en VB6 !
    Par rockroa dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 21/06/2006, 16h00
  5. Perl: Extraction de données d'un fichier texte ?
    Par fifto dans le forum Langage
    Réponses: 1
    Dernier message: 27/03/2006, 16h01

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