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 :

[langage] extraction entre 2 lignes


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 18
    Points : 7
    Points
    7
    Par défaut [langage] extraction entre 2 lignes
    Bou c'est encore moi

    J'arrive toujours pas à extraire une chaine entre 2 lignes

    j'ai testé plein d'expressions regulieres et il y en a aucunes qui afonctionnée.

    tout ce que je sais s'est qu'il faut utiliser l'option \s.

  2. #2
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Quand tu parle d'une chaine entre deux lignes, s'agit il :

    1) D'une chaine complète isolée entre deux lignes connues, comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    marqueur début
    Ligne voulue
    marqueur fin
    2) D'une chaine qui s'étend sur plusieurs lignes comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Texte à
    récupérer dans son
    intégralité
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  3. #3
    Futur Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    Une chaine comme celle ci par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    marqueur début
    Ligne voulue
     
    marqueur fin
    As tu une idée de quelles regex utiliser?

  4. #4
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    donne un exemple de fichier avec tes lines à extraire! je testerai

  5. #5
    Membre du Club
    Inscrit en
    Août 2004
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 50
    Points : 60
    Points
    60
    Par défaut
    Mais voilà:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    my $s = <<EOT;
    marqueur debut 
    Ligne voulue 
    marqueur fin
    EOT
     
    $s =~ /marqueur debut(.*?)marqueur fin/s;
     
    print $1;
    Ça donne:

    Ligne voulue

  6. #6
    Futur Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    voici un exemple de texte :

    Problem description
    Tout est planté

    Problem Resolution
    Plus rien n'est planté

    Opened by ....
    Ta solution pourrai marcher dmitry_ovsianko, si seulement je connaissais "ligne voulu".
    Je cherche à extraire les lignes en gras, le probleme c'est que ces lignes voulu sont aléatoires, le message en gras a la possiibilité de changer.

  7. #7
    Membre du Club
    Inscrit en
    Août 2004
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 50
    Points : 60
    Points
    60
    Par défaut
    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
    use Data::Dumper;
     
    my $s = <<EOT;
    Problem description 
    Tout est plante 
     
    Problem Resolution 
    Plus rien n'est plante 
     
    EOT
     
    my @paragraphes = split /\n\n/s, $s;
     
    map {s{.*?\n}{}sm} @paragraphes;
     
    print Dumper (\@paragraphes);
    donne

    $VAR1 = [
    'Tout est plante ',
    'Plus rien n\'est plante '
    ];

  8. #8
    Futur Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    Je ne comprend pas tres bien ton code.

    je ne connais pas le module Dumper, à quoi il correspond?

    voila mon code

    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
    #!/usr/bin/perl -w
     
    use strict;
     
    my ( @description, $fav) ;
    $fav = "toto.txt";
     
    open AVANT, $fav or die "Impossible d'ouvrir $fav\n";
           while (<AVANT>) {
                   #recherche de la description de la demande de la demande 
                    push @description, $2 if m/^(Problem Description\s+)(.+?)(\s+Problem Resolution)/;
                    }
     
                     print ("\n @description \n");
     
    close AVANT;
    j'ai esseyé avec cette expression réguliere mais rien n'y fait, ça me renvois rien.

  9. #9
    Membre du Club
    Inscrit en
    Août 2004
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 50
    Points : 60
    Points
    60
    Par défaut
    Data:umper -- c'est seulement pour afficher la structure de donne/es (tableau).

    Ton pb est ce que tu lis ton fichier ligne-par-ligne et veux en même temps utiliser des regexp multi-lignes.

    Ils sont gros tes fichiers?

    Si oui, écrivons un script ligne-par-ligne sans regexp.
    Sinon, avalons tout son contenu en une ligne et puis le déсoupons avec des regexp.

  10. #10
    Futur Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    Mon fichier fait une 30aines de lignes.

    J'ai 5 chaine a récupérer dans ce fichiers.
    3 se trouve en fin de ligne, pour celles là pas de problemes j'ai reussi à les récupérer avec de l'aide.
    pour les 2 autres, elles se trouvent sur des lignes entieres, j'avais aussi envisager comme solution de supprimer les retours à la ligne entre ces lignes que je n'arrive pas à extraire, mais bon j'ai un peu de mal à mettre cela en place.

  11. #11
    Membre du Club
    Inscrit en
    Août 2004
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 50
    Points : 60
    Points
    60
    Par défaut
    Pour un petit fichier il est bien commode de le charger entièrement avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $tout = join '', (<AVANT>);
    et puis le traîter avec des RegExp.

  12. #12
    Futur Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    je vais esseyer ça merci.

    mais quel serai l'expression reguliere à utiliser dans ce cas là, pour prendre une chaine entre plusieures chaines?

  13. #13
    Membre du Club
    Inscrit en
    Août 2004
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 50
    Points : 60
    Points
    60
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    my $tout = <<EOT;
    Problem description
    Tout est plante 
    Et ca va bien
     
    Problem Resolution 
    Plus rien n'est plante 
     
    EOT
     
    $tout =~ /Problem description\n(.*?)\n\nProblem Resolution/s;
     
    print $1;
    Tout est plante

  14. #14
    Futur Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    et en enlevant la partie EOT, je ne pourrai pas faire quelque chose du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    push @description, $1 if /Problem Description(.*?)Problem Resolution/s;
    vu que j'ouvre mon fichier avant, il va lire directement dedant

  15. #15
    Membre du Club
    Inscrit en
    Août 2004
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 50
    Points : 60
    Points
    60
    Par défaut
    C'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $tout = join '', (<AVANT>);
    qui remplace la partie EOT.

  16. #16
    Futur Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    mince ça n'a pas l'air de marcher
    le join est à mettre avant la boucle whileet apres le open non?

    ça ne me renvois rien

  17. #17
    Membre du Club
    Inscrit en
    Août 2004
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 50
    Points : 60
    Points
    60
    Par défaut
    Ni avant ni après, mais au lieu de while.

  18. #18
    Futur Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    bouuu

    peu etre que je m'y prend mal mais ça ne marche pas .

    la syntaxe du programme c'est bien

    ouverture du fichier
    le join
    le push
    et le print?

  19. #19
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 20
    Points : 22
    Points
    22
    Par défaut
    Salut,

    poste ton code ça ira plus vite

  20. #20
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Salut,

    Je me demande dans quelle mesure un petit retour par l'étape algorithmique/formalisation du traitement ne pourrait pas aider à résoudre ce problème.

    Peut être que concevoir une bête machine à états serait plus efficace que de construire une monstrueuse expression rationnelle qui fait tout (sauf le café, parce que ça, c'est un boulôt pour Java ) et qui n'est pas facile à maintenir ...

    Est-ce qu'une conception comme celle-ci peut te convenir (vite codée, je n'ai pas fait trop attention à tous les cas, mes variables, etc.) ?
    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
    32
    33
    34
    #!/usr/bin/perl -w
    use strict;
     
    my ( @description, $fav) ;
    $fav = "./texte.txt";
     
    open AVANT, "<".$fav or die "Impossible d'ouvrir $fav\n";
     
    my $encours = "";
     
    while (<AVANT>) {
      chomp ($_);
    print $_."\n";  
     
      if ( /^Problem Description/ ) {
        push (@description, $encours) if ($encours ne "");
        $_ = $encours = "";
      }
      if ( /^Problem Resolution/ ) {
        push (@description, $encours) if ($encours ne "");
        $_ = $encours = "";
      }
      $encours .= $_."\n";
    }
     
    close AVANT;
     
    if ($encours ne "") {
      push (@description, $encours);
    }
     
    foreach (@description) {
      print ("-> $_\n");
    }
    Comme tu vois, il est facile d'ajouter d'autres cas, voire d'utiliser des tableaux différents pour les différentes catégories de messages ...

    Bonne continuation
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Espacement entre les ligne d'un tableau
    Par Flobel dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 02/11/2004, 09h33
  2. Réponses: 4
    Dernier message: 02/09/2004, 21h43
  3. Réponses: 6
    Dernier message: 04/03/2004, 09h35
  4. Réponses: 3
    Dernier message: 21/01/2004, 08h47

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