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

Langage Java Discussion :

Lecture d'un fichier bloc par bloc avec séparateur de lignes


Sujet :

Langage Java

  1. #1
    Membre habitué Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 301
    Points : 135
    Points
    135
    Par défaut Lecture d'un fichier bloc par bloc avec séparateur de lignes
    Bonjour,

    Je suis confronté au problème suivant.

    J'ai un fichier (ou une chaine) contenant des données au format texte de la forme suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    xx
    Bloc1 Ligne1
    Bloc1 Ligne2
    Bloc1 Ligne3
    xx
    Bloc2 Ligne1
    Bloc2 Ligne2
    Bloc2 Ligne3
    Bloc2 Ligne4
    xx
    Bloc3 Ligne1
    Bloc3 Ligne2
    Bloc3 Ligne3
    xx
    xx est le séparateur de bloc de lignes, et la ligne BlocN LigneM, la ligne M de données texte du bloc N.

    Je pourrais le lire ligne par ligne avec un reader:
    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
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.StringReader;
    public class Test02 {
      public static void main(String[] args) throws IOException {
        String s = "xx\n" + 
          "Bloc1 Ligne1\n" + 
          "Bloc1 Ligne2\n" +
          "Bloc1 Ligne3\n" + 
          "xx\n" + 
          "Bloc2 Ligne1\n" +
          "Bloc2 Ligne2\n" + 
          "Bloc2 Ligne3\n" + 
          "Bloc2 Ligne4\n" +
          "xx\n" + 
          "Bloc3 Ligne1\n" + 
          "Bloc3 Ligne2\n" +
          "Bloc3 Ligne3\n" + 
          "xx";
        String thisLine;
        BufferedReader buff = new BufferedReader(new StringReader(s));
        while ((thisLine = buff.readLine()) != null) {
          System.out.println(thisLine);
        }
      }
    }
    Mais je souhaite le lire bloc de lignes par bloc de lignes.
    Il me faut donc écrire quelque chose d'équivalent qui, par exemple, après le deuxième appel, me renverrait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Bloc2 Ligne1
    Bloc2 Ligne2
    Bloc2 Ligne3
    Bloc2 Ligne4
    Comment puis-je faire?

    Merci.

  2. #2
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonjour,

    avec s.split("xx\n") tu auras un tableau avec les blocs. Mais avec ce que tu as, tu auras une chaine vide au début et à la fin du tableau.

    A+.

  3. #3
    Membre habitué Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 301
    Points : 135
    Points
    135
    Par défaut
    Merci andry.aime pour ton aide

    Citation Envoyé par andry.aime Voir le message
    avec s.split("xx\n") tu auras un tableau avec les blocs.
    Oui, c'est vrai que c'est pas mal...

    Citation Envoyé par andry.aime Voir le message
    Mais avec ce que tu as, tu auras une chaine vide au début et à la fin du tableau.
    ...mais c'est plutôt génant!

    De plus, la chaine est plutôt pour le "test case", car le fichier peut être volumineux.

    En cherchant ce matin, je suis tombé sur une classe Java "Scanner". Mais je ne sais pas si cela conviendra.

  4. #4
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Re,

    J'ai un peu mal lu, j'ai pas vu que c'est un fichier. Dans ce cas, oublie le split . Tu peux plutôt scanner ou un BufferReader en testant si la ligne est égal à "xx\n".

    A+.

  5. #5
    Membre éclairé Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Points : 803
    Points
    803
    Par défaut
    Nan mais c'est quoi la question, exactement ? "comment lire un fichier texte ?" ou bien "comment reconnaître une ligne composée uniquement de 'x' ? " ou bien ...?
    Sans danger si utilisé conformément au mode d'emploi.

    (anciennement BenWillard, enfin moins anciennement que ... enfin bon c'est une longue histoire... Un genre de voyage dans le temps...)

  6. #6
    Membre habitué Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 301
    Points : 135
    Points
    135
    Par défaut
    Merci pour ton aide andry.aime

    Citation Envoyé par JoeChip Voir le message
    Nan mais c'est quoi la question, exactement ?
    Il s'agit de lire le fichier par bloc au moyen d'un appel à une méthode, sachant qu'un bloc est séparé par "une ligne séparatrice" constitué de xx.

    Je suis quasiment arrivé à résoudre mon problème en procédant comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Scanner scan = new Scanner(s);
    scan.useDelimiter(Pattern.compile("xx[\\r]?[\\n]+"));
    int i = 1;
    while (scan.hasNextLine()) {
      System.out.println("Data[" + (i++) + "]=[" + scan.next() + "]");
    }
    qui donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Data[1]=[Bloc1 Ligne1
    Bloc1 Ligne2
    Bloc1 Ligne3
    ]
    Data[2]=[Bloc2 Ligne1
    Bloc2 Ligne2
    Bloc2 Ligne3
    Bloc2 Ligne4
    ]
    Data[3]=[Bloc3 Ligne1
    Bloc3 Ligne2
    Bloc3 Ligne3
    xx]
    Le seul problème est qu'il reste un résidu xx en fin de fichier

  7. #7
    Membre habitué Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 301
    Points : 135
    Points
    135
    Par défaut
    Quelqu'un a-t-il une idée pour éliminer la ligne résiduelle xx en fin de fichier ?

    Merci.

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Citation Envoyé par domiq44 Voir le message
    Quelqu'un a-t-il une idée pour éliminer la ligne résiduelle xx en fin de fichier ?
    Pas avec un Scanner. De toute façon, avec ta méthode, ça donne quoi, ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Bloc1 ligne1xx
    Bloc1 ligne2
    xx
    Bloc2 ligne1
    ?

    Ce que tu fais est un peu trop élaboré pour des outils tout faits, mais pas assez élaboré pour un vrai parseur de langage.
    Il vaut mieux utiliser un BufferedReader, lire ligne par ligne, accumuler les lignes d'un même bloc dans un StringBuilder, et repérer les lignes "xx" qui séparent deux blocs.
    C'est du niveau zéro d'algorithmique, au boulot.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre habitué Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 301
    Points : 135
    Points
    135
    Par défaut
    Citation Envoyé par thelvin Voir le message
    C'est du niveau zéro d'algorithmique, au boulot.
    Tu as raison thelvin.
    J'ai fait ça simplement, comme tu m'as dit et ça fonctionne parfaitement.
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lecture d'un fichier .bin par un bloc simulink
    Par devdev01 dans le forum Simulink
    Réponses: 0
    Dernier message: 05/05/2015, 20h47
  2. [AC-2010] Chiffrement par blocs pas compatible avec le verrouillage des lignes
    Par Daejung dans le forum Sécurité
    Réponses: 7
    Dernier message: 18/02/2015, 22h45
  3. Chargement fichier texte bloc par bloc [VB.NET]
    Par kevin01330 dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 23/04/2013, 09h08
  4. Réponses: 3
    Dernier message: 16/03/2011, 14h36
  5. Tri fichier texte par bloc
    Par foubou dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 08/11/2008, 00h04

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