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

  1. #1
    Membre à l'essai
    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
    Points : 15
    Points
    15
    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 : 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,

    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 à l'essai
    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
    Points : 15
    Points
    15
    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 à l'essai
    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
    Points : 15
    Points
    15
    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 : 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 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 à l'essai
    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
    Points : 15
    Points
    15
    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 : 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 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.

  8. #8
    Membre chevronné Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Points : 2 120
    Points
    2 120
    Par défaut
    salut,
    a partir de quoi incrementes-tu le nombre de "FIX" dans ton fichier?

    1. - a partir du dernier mot "FIX|00001" ==> FIX 1
    2. - a partir du nombre d´occurrences du mot FIX dans le fichier.
    3. - dans le cas ou le mot "FIX" est ecrit "FIX|"dans la ligne, comment se passe l´incrementation ?



    Eric

  9. #9
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Août 2014
    Messages : 262
    Points : 634
    Points
    634
    Par défaut
    Salut voici un exemple du contenu d'un fichier :
    DES|
    FIX|
    VAR|
    DES|
    FIX|000001
    DES|
    FIX|000001
    DES |
    FIX|000002
    VAR|
    DES|
    FIX|000003
    Est-ce ce résultat ci que tu veux avoir :
    DES|
    FIX|
    VAR|
    DES|
    DES|
    FIX|000002
    DES |
    FIX|000003
    VAR|
    DES|
    FIX|000003
    Aujourd'hui apprenant, demain appreneur.
    N'accuse pas le puits d'être trop profond,
    c'est peut-être ta corde qui est trop courte

  10. #10
    Membre à l'essai
    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
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par lankoande Voir le message
    Salut voici un exemple du contenu d'un fichier :

    Est-ce ce résultat ci que tu veux avoir :
    Bonjour,

    non, il ne me faut pas ce résultat.
    Si en entrée j'ai :
    DES
    FIX
    VAR
    DES
    FIX
    DES
    FIX

    il faut en sortie
    DES
    FIX
    VAR
    DES
    FIX
    FIX


    Il faut supprimer chaque DES qui se trouve entre des FIX.

    Merci.

    Cdlt,

  11. #11
    Membre chevronné Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Points : 2 120
    Points
    2 120
    Par défaut
    Salut,
    et si tu as en entrée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DES
    FIX
    VAR
    DES
    FIX|0004
    DES
    FIX
    comment devrait etre la sortie?

    Eric

  12. #12
    Membre à l'essai
    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
    Points : 15
    Points
    15
    Par défaut
    Bonjour à tous,

    la demande initiale vient de changer. Ça n'a plus rien à voir, c'est encore plus tordu... Je vais attendre un peu car j'ai l'impression qu'ils ne savent pas trop ce qu'ils veulent. En Stand-By pour le moment.

    Merci à tous, car grâce à vos retours, j'ai pu avancer sur une bêta solution... qui ne sert plus à rien maintenant.

    @+

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