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 :

Parser un fichier organisé en Section Element avec des regex


Sujet :

Langage Perl

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Parser un fichier organisé en Section Element avec des regex
    Bonjour

    Je travail sur un script perl qui analyse un fichier texte avec un format spécifique :

    Section1
    Item1
    Item2
    Item3
    Item4

    Section2
    Item1
    Item2
    Item3
    Item4

    En sachant que j'ai déjà une petite idée du nom des sections.

    Mon programme est déjà assez bien avancé, bien compliqué, très orienté regexp, alors je vais exposer un exemple simple :

    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
     
    #!/usr/bin/perl -w
     
    use strict;
    use warnings;
     
    my $text = <<END;
    Hommes
    Pierre
    Paul
    Jacques
    Jean
     
    Femmes
    Marie
    Julie
    END
     
    my %items = (
    	hommes => [$text =~ /^Hommes\n/gim and $text =~ /\G(*.)\n/gim],
    	femmes => [$text =~ /^Femmes\n/gim and $text =~ /\G(.*)\n/gim],
    );
     
    print "$_\n" foreach (@{$items{femmes}});
     
    print "$_\n" foreach (@{$items{hommes}});
    $text : mon fichier (enfin, du texte quoi!)
    %items : hash contenant la liste des items pour chacune des sections

    hommes => [$text =~ /^Hommes\n/gim and $text =~ /\G(.*)\n/gim],
    Ajoute au hash une liste identifié par la clé "hommes".

    $text =~ /^Hommes\n/gim
    Recherche le motif correspondant à la section homme avec un retour de ligne à la fin du motif
    (non sensible à la casse, recherche multiligne pour que ^ corresponde à un début de ligne n'importe où dans la variable $text)
    ==> LOCALISE LA SECTION

    $text =~ /\G(.*)\n/gim
    Recherche chaque motif correspondant à une section et l'ajoute au tableau à revoyer.
    \G permet de reprendre la recherche juste derrière le nom de la section
    \n à la fin permet à \G de reprendre à chaque début de nouvelle ligne
    (recherche multiple, multiligne, non sensible à la casse)
    ==> ENREGISTRE CHAQUE ITEM DE LA SECTION

    Le problème est que si $text =~ /\G(.*)\n/gim rencontre le motif (.*)\n\n il est sensé arrêter la recherche alors qu'il continue.

    Le résultat des print est :
    Marie
    Julie
    Pierre
    Paul
    Jacques
    Jean

    Femmes
    Marie
    Julie

    print "$_\n" foreach (@{$items{hommes}}) ne s'arrête pas à Jean comme il le devrait.

    Voilà en espérant avoir été clair.

    Merci d'avance

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Résolu
    Ce sujet a tellement de succès que j'ai eu le temps de trouver par moi même.
    En fait l'astuce pour être sûr de ne pas se gourer est de séparer chaque section en paragraphes.

    Code : Perl

    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
    #!/usr/bin/perl -w
     
    use strict;
    use warnings;
     
    my $text = <<END;
    Hommes
    Pierre
    Paul
    Jacques
    Jean
     
    Femmes
    Marie
    Julie
    END
     
    # Découpage des paragraphes
    my @paragraph = split /\n{2,}/, $text;
     
    # Enregistrement des sections
    my %items;
    foreach (@paragraph) {
    	if(/^Hommes\n?/ig) { $items{hommes} = [/\G(.*)\n?/ig]; }
    	if(/^Femmes\n?/ig) { $items{femmes} = [/\G(.*)\n?/ig]; }
    }
     
    print "$_\n" foreach (@{$items{hommes}});
    print "\n\n\n";
    print "$_\n" foreach (@{$items{femmes}});
    Astuce:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(/^Hommes\n?/ig) { $items{hommes} = [/\G$(.*)\n?/ig]; }
    [ ....... ] permet de forcer un contexte de liste et de renvoyer une référence vers cette liste (très utile pour éviter l'"aplatissement")
    \n? à la fin de la regexp de section permet de prévoir le cas où une section nommée n'aurait pas d'item.
    \n? à la fin de la regexp d'item permet de prendre en compte aussi le dernier élément (ben oui, puisque le dernier élément de chaque paragraphe ne se termine pas par \n !!)

    Enjoy.
    Pour tous ceux qui veulent récupérer une liste d'items de sections organisés en paragraphes.

    Moi j'ai mis toute une journée pour trouver cette façon de faire. Mais il y en a surement d'autres !
    Après tout : TMTOWTDI

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

Discussions similaires

  1. [JDOM] Comment parser un child d'un root element avec org.jdom ?
    Par Battosaiii dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 10/10/2011, 09h20
  2. fichier issu d'une bufferisation avec des include
    Par xxxavvv dans le forum Langage
    Réponses: 0
    Dernier message: 27/04/2010, 14h15
  3. Formulaire avec 3 sections : problème avec des div
    Par Nicolas74 dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 02/02/2010, 14h18
  4. remanier un fichier avec des regex
    Par chong dans le forum Langage
    Réponses: 8
    Dernier message: 19/08/2008, 13h07

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