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 Perl Discussion :

reconnaissance de ligne


Sujet :

Langage Perl

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Par défaut reconnaissance de ligne
    Bonjour a tous,

    Je rencontre un petit probleme sur de la reconnaissance de données récupérées dans un fichier texte.

    Mon fichier texte comprend:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    GROUPE:
    SOUS_GROUPE1: 
        - event1    (option1)
        - event2    (option2)
    FIN_SOUS_GROUPE1
    SOUS_GROUPE2: 
        - event1    (option1)
        - event2    (option2)
    FIN_SOUS_GROUPE2
    FIN_GROUPE
    J'essaie de récupérer le(s) duo(s) event/option lié(s) au groupe l'encadrant:

    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
     
         if(/GROUPE:\s+/)
         {
           my $temp = <FIC>;
           while($temp ne "FIN_GROUPE")
           {  
             if($temp =~/(SOUS_\S+):/i)
             {
               my $grp = $1;
               $temp = <FIC>;          
               while($temp ne "END_$grp" )
               {
                 if($temp =~ /^\s+- (\S+)\s+\((\S+)\)/i) 
                 {
                   print "1=$1\n";
                   print "2=$2\n";
                 }
                 $temp = <FIC>;
               }
             }
             $temp = <FIC>;
           }
         }
    Il semblerait que mon probleme vienne de la ligne
    car cette condition n'est jamais remplie et je ne ressors jamais de cette boucle.

    Comment puis je lier correctement "END_" avec la variable contenant le nom du groupe ?

    Merci d'avance,

    cdlt
    Guillaume

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     while($temp ne "END_$grp" )
    dans ton exemple c'est FIN.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Par défaut
    Merci d'avoir repondu,

    Je me suis trompé en réécrivant,
    Il ne parvient quand meme pas a l'identifier.

    J'ai rajouté cette ligne pour vérifier que la valeur lue du fichier était correct:
    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
     
     
         if(/GROUPE:\s+/)
         {
           my $temp = <FIC>;
           while($temp ne "FIN_GROUPE")
           {  
             if($temp =~/(SOUS_\S+):/i)
             {
               my $grp = $1;
               $temp = <FIC>;          
               while($temp ne "FIN_$grp" )
               {
                 if($temp =~ /^\s+- (\S+)\s+\((\S+)\)/i) 
                 {
                   print "1=$1\n";
                   print "2=$2\n";
                 }
                 $temp = <FIC>;
                 if($temp eq "FIN_$grp")
                 {
                  print "reconnaissance ok\n";
                }
               }
             }
             $temp = <FIC>;
           }
         }
    pourtant ca ne le reconnait jamais...
    La syntaxe de comparaison est elle correct (FIN__$grp)?

    Merci d'avance

  4. #4
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Bon apprends à lire proprement un fichier. Ton code ne le fais pas proprement.

  5. #5
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Voici une petite aide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    open (FILE, '<', 'tonfichier.txt');
    while ( my $ligne = <FILE> ) {
      chomp $ligne;
      if ( my ($sous_groupe) = $ligne =~ /(SOUS_\S+\d+):/ ) {
        print "$sous_groupe\n";
      }
      elsif ( my ($event, $option) = $ligne =~ /^\s+-\s+(\S+)\s+\((\S+)\)/ ) {
        print "\t- $event, $option\n";
      }
    }
    close(FILE);

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Par défaut
    Merci pour cette reponse,

    Mon fichier texte ne se resume pas a ces quelques lignes, c'est un log de definition d' elements, et chaque element comprend l'exemple que j'ai marqué.

    Etant donné que je pensais la lecture sequentiellement a l'interieur d'une iteration du while, je n'avais pas trouvé un moyen d'inclure une boucle conditionnelle sans casser cette lecture.

    Un exemple est toujours plus significatif:

    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
     
    PRODUIT 1
    taille xxxx
    temps xxxx
    ...
    GROUPE:
    SOUS_GROUPE1: 
        - event1    (option1)
        - event2    (option2)
    FIN_SOUS_GROUPE1
    SOUS_GROUPE2: 
        - event1    (option1)
        - event2    (option2)
    FIN_SOUS_GROUPE2
    FIN_GROUPE
     
     
    PRODUIT 2
    taille xxxx
    temps xxxx
    ...
    GROUPE:
    SOUS_GROUPE1: 
        - event1    (option1)
        - event2    (option2)
    FIN_SOUS_GROUPE1
    SOUS_GROUPE2: 
        - event1    (option1)
        - event2    (option2)
    FIN_SOUS_GROUPE2
    FIN_GROUPE
    Quand le fichier est lu, toutes les infos sont mises sequentiellement dans une table de hash selon la cle définie par produit (1, 2, ...),
    Pour les groupes, event, options, le probleme est que leur taille n'est pas fixe.
    C'est pour ca que j'avais mis (FIN_XXXX) pour les delimiter.


    En utilisant ta solution cela simplifie le fichier de log :

    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
     
    PRODUIT 1
    taille xxxx
    temps xxxx
    ...
    SOUS_GROUPE1: 
        - event1    (option1)
        - event2    (option2)
    SOUS_GROUPE2: 
        - event1    (option1)
        - event2    (option2)
     
     
    PRODUIT 2
    taille xxxx
    temps xxxx
    ...
    SOUS_GROUPE1: 
        - event1    (option1)
        - event2    (option2)
    SOUS_GROUPE2: 
        - event1    (option1)
        - event2    (option2)
    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
     
    open (FILE, '<', 'tonfichier.txt');
    while ( my $ligne = <FILE> ) {
      chomp $ligne;
      if ( my ($produit) = $ligne =~ /PRODUIT\s*(\S+)/){
        print "$produit\n";
      if ( my ($sous_groupe) = $ligne =~ /(SOUS_\S+\d+):/ ) {
        print "$sous_groupe\n";
        # on insere sous_groupe dans hash selon $produit
      }
      elsif ( my ($event, $option) = $ligne =~ /^\s+-\s+(\S+)\s+\((\S+)\)/ ) {
        print "\t- $event, $option\n";
        # on insere event et option dans hash selon sous_groupe et produit
      }
    }
    close(FILE);
    C'est moi qui me suis perdu au final en voulant lire toutes les infos d'un seul coup (en imbriquant des whiles), j'aurais du me servir des itérations du while principal.

    Merci en tout cas je vais tester et te tiens au jus.

    cdlt

  7. #7
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Pour gérer ce genre de situation, j'aime bien utiliser la bascule logique ".." :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    while (<FILE)) {
      $in_produit = /PRODUIT\s*(\S+)/ .. /FIN_PRODUIT/;
      $produit = $1 if $in_produit == 1;
      $in_sous_groupe = /(SOUS_GROUPE\S+):/ .. /FIN_SOUS_GROUPE\S+/;
      $sous_groupe = $1 if $in_sous_groupe == 1;
      if ($in_sous_groupe > 1 && my ($event, $option) = $ligne =~ /^\s+-\s+(\S+)\s+\((\S+)\)/) {
        ...
      }
    }
    Ta problématique assez simple ne nécessite peut-être pas de l'utiliser, mais ça t'auras peut-être fait découvrir un opérateur intéressant.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Par défaut
    Cool, merci,
    Je ne la connaissais pas, dans mon cas la ça n'était pas nécessaire mais ça peut être utile par la suite.

    Merci,
    @+

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

Discussions similaires

  1. Reconnaissance en-ligne d'écriture manuscrite
    Par houdini46 dans le forum Algorithmes et structures de données
    Réponses: 0
    Dernier message: 16/04/2014, 14h46
  2. reconnaissance de valeur et copie de ligne
    Par Zavatta131 dans le forum Excel
    Réponses: 1
    Dernier message: 10/10/2012, 19h20
  3. reconnaissance de saut de lignes et get line
    Par membreComplexe12 dans le forum C++
    Réponses: 6
    Dernier message: 15/02/2011, 18h05
  4. [AC-2007] Non reconnaissance des lignes par requête
    Par deleterz dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 10/03/2010, 14h51
  5. [1.x] reconnaissance ligne de commande symphony
    Par Tanebisse dans le forum Symfony
    Réponses: 7
    Dernier message: 16/09/2008, 16h13

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