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 :

Traitement fichier texte


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 20
    Par défaut Traitement fichier texte
    Bonjour,

    débutant en Java, je dois traiter un fichier texte. Je dois supprimer une ligne du fichier lorsque celle-ci apparaît dans un certain ordre.

    Exemple, le fichier est constitué de cette manière :
    DES|
    FIX|
    VAR|
    DES|
    FIX|000001
    DES| => Lorsque j'ai un DES juste après un FIX, je dois supprimer cette ligne.
    FIX|000001 => Une fois le DES du dessus supprimé, je dois incrémenter ce compteur => le passer à 000002
    VAR|

    Pouvez-vous me mettre sur une piste ? Quelle orientation dois-je prendre ?

    Merci pour l'aide que vous pourrez m'apporter.

    Cdlt,

  2. #2
    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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Salut,

    1. On ne peut pas supprimer une ligne dans un fichier : on copie toutes les lignes sauf celles qu'on veut effacer dans un nouveau fichier.
    2. Le principe pour faire un traitement d'une ligne en fonction d'une autre se trouvant avant et tout simplement de mémoriser cette dernière, ou au moins l'information nécessaire et suffisante.
      Dans ton cas, la condition "est FIX" est suffisante et il s'agit d'un boolean. Comme le traitement concerne en fait trois lignes, il te faudra un second boolean qui permet de savoir qu'il faut incrémenter le compteur d'une ligne fix
      Code pseudocode : 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
      lignevantestfix = false
      incrementercompteurfix = false
      pour toute les lignes du fichier 
          ligne = ligne actuellement lue du fichier
          si incrementercompteur 
             si ligne est FIX 
                 incrementer compteur de ligne
                 changer ligne (concaténer "FIX|" avec nouveau compteur)
             fin si
             incrementercompteur = false 
          fin si
          si ligneavantestfix et ligne est "DES"
             incrementercompteur = true // ici on ne copie pas la ligne ce qui fait qu'elle est supprimée
          sinon
             copier ligne vers nouveau fichier
          fin si
          si ligne est "FIX"
               ligneavantestfix = true
          sinon
               ligneavantestfix = false
          finsi
      fin pour
    3. Pour traiter les lignes de type FIX|00001, il te faut :
      1. découper la ligne en 2 parties suivant le pipe (|), ce qui peut se faire facilement avec String.split()
      2. Il te faut convertir la partie nombre en int (Integer.parseInt())
      3. fl te faut recomposer la ligne en chaine de caractères, avec les 0 pour avoir un compteur formaté sur 6 caractères, ce que tu pourras très facilement faire avec String.format()
      4. Traiter le cas particulier de la ligne FIX| qui correspond à FIX|000000
        Il suffit de tester si la ligne est égale à "FIX|" ou commence par "FIX|"
        • La fonction —ligne est "FIX"— correspond à —si ligne commence par "FIX|"—
        • La fonction qui détermine la valeur actuelle du compteur est (seulement pour les lignes validant la condition précédente)
          Code pseudocode : Sélectionner tout - Visualiser dans une fenêtre à part
          1
          2
          3
          4
          5
          6
           
          si ligne égale "FIX|" 
             compteur = 0
          sinon
             compteur = extraitre valeur (avec String.split() et Integer.parseInt())
          fin si

        [/code]
    4. Le moyen le plus simple pour lire les lignes d'un fichier, s'il n'est trop grand, est :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      for(String ligne : Files.readAllLines(Paths.get( nomfichier ) ) {
       
      }
      Sinon :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      try(BufferedReader reader = Files.newBufferedReader( Paths.get( nomfichier ) ) ) {
       
         for(String line = reader.readLine(); line!=null; line = reader.readLine()) {
       
         }
       
      }

    Pour String.split() et String.format(), je te laisse pour l'instant regarder leur usage dans la doc
    • juste un conseil/alerte au sujet de split() : le paramètre est une expression régulière et | est un caractère significatif en expression régulière
    • pour format, regarde le motif %d
    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.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 20
    Par défaut
    Merci pour cette explication et cette ligne à suivre.

    Je vais m'y atteler dès aujourd'hui. Je te tiens au courant de mes avancées.

    @+

    Cdlt,

  4. #4
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 20
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Salut,

    1. On ne peut pas supprimer une ligne dans un fichier : on copie toutes les lignes sauf celles qu'on veut effacer dans un nouveau fichier.
    2. Le principe pour faire un traitement d'une ligne en fonction d'une autre se trouvant avant et tout simplement de mémoriser cette dernière, ou au moins l'information nécessaire et suffisante.
      Dans ton cas, la condition "est FIX" est suffisante et il s'agit d'un boolean. Comme le traitement concerne en fait trois lignes, il te faudra un second boolean qui permet de savoir qu'il faut incrémenter le compteur d'une ligne fix
      Code pseudocode : 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
      lignevantestfix = false
      incrementercompteurfix = false
      pour toute les lignes du fichier 
          ligne = ligne actuellement lue du fichier
          si incrementercompteur 
             si ligne est FIX 
                 incrementer compteur de ligne
                 changer ligne (concaténer "FIX|" avec nouveau compteur)
             fin si
             incrementercompteur = false 
          fin si
          si ligneavantestfix et ligne est "DES"
             incrementercompteur = true // ici on ne copie pas la ligne ce qui fait qu'elle est supprimée
          sinon
             copier ligne vers nouveau fichier
          fin si
          si ligne est "FIX"
               ligneavantestfix = true
          sinon
               ligneavantestfix = false
          finsi
      fin pour
    3. Pour traiter les lignes de type FIX|00001, il te faut :
      1. découper la ligne en 2 parties suivant le pipe (|), ce qui peut se faire facilement avec String.split()
      2. Il te faut convertir la partie nombre en int (Integer.parseInt())
      3. fl te faut recomposer la ligne en chaine de caractères, avec les 0 pour avoir un compteur formaté sur 6 caractères, ce que tu pourras très facilement faire avec String.format()
      4. Traiter le cas particulier de la ligne FIX| qui correspond à FIX|000000
        Il suffit de tester si la ligne est égale à "FIX|" ou commence par "FIX|"
        • La fonction —ligne est "FIX"— correspond à —si ligne commence par "FIX|"—
        • La fonction qui détermine la valeur actuelle du compteur est (seulement pour les lignes validant la condition précédente)
          Code pseudocode : Sélectionner tout - Visualiser dans une fenêtre à part
          1
          2
          3
          4
          5
          6
           
          si ligne égale "FIX|" 
             compteur = 0
          sinon
             compteur = extraitre valeur (avec String.split() et Integer.parseInt())
          fin si

        [/code]
    4. Le moyen le plus simple pour lire les lignes d'un fichier, s'il n'est trop grand, est :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      for(String ligne : Files.readAllLines(Paths.get( nomfichier ) ) {
       
      }
      Sinon :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      try(BufferedReader reader = Files.newBufferedReader( Paths.get( nomfichier ) ) ) {
       
         for(String line = reader.readLine(); line!=null; line = reader.readLine()) {
       
         }
       
      }

    Pour String.split() et String.format(), je te laisse pour l'instant regarder leur usage dans la doc
    • juste un conseil/alerte au sujet de split() : le paramètre est une expression régulière et | est un caractère significatif en expression régulière
    • pour format, regarde le motif %d
    Re,

    afin d'être sûr qu'on soit en phase sur ce que je souhaite faire, je dois supprimer la ligne DES lorsque celle-ci se trouve entre deux FIX. On est en phase ?
    Sinon, je reconnais avoir du mal malgré ton aide précieuse... Je continue de chercher de mon côté.

    @+ tard.

  5. #5
    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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par nicomes371 Voir le message
    afin d'être sûr qu'on soit en phase sur ce que je souhaite faire, je dois supprimer la ligne DES lorsque celle-ci se trouve entre deux FIX. On est en phase ?
    Ah, non, ce n'est pas ce qui était décrit dans ton premier message. Ton premier message dit qu'on doit supprimer une ligne DES qui suit une ligne FIX et incrémenter le compteur de la ligne FIX suivante. Rien ne dit que la ligne FIX suivante est obligatoire. Donc il faut garder la mémoire qu'on a lu une DES avant précédé d'une FIX (on n'a pas besoin de garder la ligne en mémoire, parce qu'elle n'a pas de contenu particulier, on peut toujours la régénérer depuis zéro.

    C'est un peu plus complexe du coup, à faire en séquence, parce qu'on ne sait pas si on doit copier une ligne (ou effacer si on le prend dans l'autre sens), tant qu'on a pas vérifier la ligne suivante. En chargeant toutes les lignes dans une liste, c'est plus simple : on la met de côté dans une variable, dès qu'on trouve une ligne FIX, on cherche si la suivante est DES et sa suivante est FIX, si oui on traite en un lot (les trois lignes).


    Si tu as des difficultés, commencent par faire les parties simples de façon isolée :

    • incrémenter le compteur d'une ligne de type FIX| / FIX|000001, par exemple
    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.

  6. #6
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 20
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Ah, non, ce n'est pas ce qui était décrit dans ton premier message. Ton premier message dit qu'on doit supprimer une ligne DES qui suit une ligne FIX et incrémenter le compteur de la ligne FIX suivante. Rien ne dit que la ligne FIX suivante est obligatoire. Donc il faut garder la mémoire qu'on a lu une DES avant précédé d'une FIX (on n'a pas besoin de garder la ligne en mémoire, parce qu'elle n'a pas de contenu particulier, on peut toujours la régénérer depuis zéro.

    C'est un peu plus complexe du coup, à faire en séquence, parce qu'on ne sait pas si on doit copier une ligne (ou effacer si on le prend dans l'autre sens), tant qu'on a pas vérifier la ligne suivante. En chargeant toutes les lignes dans une liste, c'est plus simple : on la met de côté dans une variable, dès qu'on trouve une ligne FIX, on cherche si la suivante est DES et sa suivante est FIX, si oui on traite en un lot (les trois lignes).


    Si tu as des difficultés, commencent par faire les parties simples de façon isolée :

    • incrémenter le compteur d'une ligne de type FIX| / FIX|000001, par exemple
    Désolé de m'être mal exprimé dans le 1er post. C'est en lisant ton 1er retour, je me suis rendu compte, que ça ne collait pas. C'est compliqué effectivement, mais j'étais parti sur ton idée de mettre dans une liste. Pour le moment, j'ai mis tout le contenu du fichier dans un tableau. Maintenant, il faut que j'isole mon cas "FIX - DES -FIX". Si je trouve ça, je supprime le DES et j'incrémente le compteur du FIX.

    C'est parti !

  7. #7
    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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par nicomes371 Voir le message
    Pour le moment, j'ai mis tout le contenu du fichier dans un tableau.
    Pourquoi dans un tableau, alors que dans une liste ça se fait en une méthode utilitaire (Files.readAllLines()) ? Pour un tableau, c'est plutôt galère même, parce qu'il faut connaitre le nombre de lignes d'abord (pour dimensionner le tableau, donc lire le fichier en entier 2 fois), ou alors tu charges dans une liste pour la convertir en tableau, ce qui n'a aucun intérêt : une liste se manipule plus facilement qu'un tableau.
    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.

Discussions similaires

  1. [Débutant] Traitement fichier texte
    Par mathphobic dans le forum MATLAB
    Réponses: 4
    Dernier message: 14/05/2014, 13h29
  2. traitement fichier text
    Par ameno_123 dans le forum Langage
    Réponses: 12
    Dernier message: 17/01/2013, 11h44
  3. Traitement fichier texte
    Par devoluti0n dans le forum Débuter
    Réponses: 21
    Dernier message: 29/09/2007, 13h45
  4. Traitement fichier texte
    Par spy666ne dans le forum C++
    Réponses: 1
    Dernier message: 30/03/2007, 13h05
  5. [PERL] traitement fichier texte
    Par osiris73 dans le forum Langage
    Réponses: 10
    Dernier message: 05/05/2006, 20h06

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