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 :

Recherche de motif dans un fichier texte.


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 7
    Points : 7
    Points
    7
    Par défaut Recherche de motif dans un fichier texte.
    Bonjour a tous, je suis nouveau sur le forum et débutant en Perl.
    Je rencontre un léger soucis...
    Je dois traiter un fichier texte relativement long et extraire certaines données.

    Toutes les données que je dois récupérer sont sous forme de blocs commençaient par le mot "intro"

    ex:
    intro
    contenu du bloc de texte.....
    ...........
    ...........
    ............
    intro
    contenu du bloc de texte2........
    ...........
    ...........
    ............
    intro
    .......

    J'ai d'abord pensé utiliser une recherche de motif du type:

    If (/intro/ ... /intro/)
    ...

    Je récupère bien les informations contenues entre les balises "intro".

    Le souci est que cette balise "intro" sert a la fois d'indicateur de fin d'un bloc et de début du bloc suivant.

    Au final je ne récupère qu'un bloc sur deux...
    Quelqu'un a t'il une solution à me suggérer ?

    Suite du problème, le nombre de ces blocs à traiter est variable suivant les fichiers.
    Je voudrai ensuite insérer chacun des blocs dans un tableau.
    Ne connaissant pas à l'avance le nombre de blocs que je vais récupérer, il faudrait donc (je pense à l'aide d'une boucle) que je crée un tableau a chaque fois qu'un bloc est trouvé dans le fichier.
    Une sorte de création dynamique (désolé si je m'exprime mal, j'essaie avec mes mots de définir ce que je dois faire..).

    D'avance merci à la personne qui pourra éclairer ma lanterne.

  2. #2
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Si ton fichier ne contient QUE des blocs qui commencent avec intro, il est possible de faire plus simple, mais s'il peut contenir autre chose, alors voici une idée pour traiter tes deux problèmes à la fois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    my @bloc = ();
    while (my $line = <STDIN>) {
      my $in_bloc = $line =~ /^intro/ ... $line =~ /^intro/;
      # En fin de bloc, on affiche le bloc, on le vide et on relit la même ligne pour commencer un nouveau bloc
      if ($in_bloc =~ /E0/) {
        print "BLOC: ", (join "", @bloc);
        @bloc = ();
        redo;
      }
      push @bloc, $line if $in_bloc;
    }
    print "BLOC: ", (join "", @bloc) if @bloc;
    Ceci permet de ré-évaluer le flip-flop de l'opérateur ... avec la même ligne du fichier, pour détecter un début de bloc.

    Cela dit, il est possible de réaliser à peu près la même chose sans l'opérateur d'intervalle, simplement en testant la présence de intro qui représente toujours un bloc terminé si le bloc est non vide (sans oublier en sortie de boucle de traiter le dernier bloc). Il faut pour cela que le fichier commence par une ligne intro :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    my @bloc = ();
    while (my $line = <STDIN>) {
      if ($line =~ /^intro/ && @bloc) {
        print "BLOC: ", (join "", @bloc);
        @bloc = ();
      }
      push @bloc, $line;
    }
    print "BLOC: ", (join "", @bloc) if @bloc;
    Je n'ai pas testé exactement le même code, il peut donc contenir des erreurs.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    D'accord, bah ca a l'air de fonctionner, je vais essayer de me débrouiller pour la suite, En tout cas merci pour le coup de main!!!

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

Discussions similaires

  1. Rechercher un mot dans un fichier texte
    Par elscorpio dans le forum VB.NET
    Réponses: 3
    Dernier message: 02/06/2014, 17h04
  2. [PHP 5.0] Rechercher un script dans un fichier texte
    Par schats dans le forum Langage
    Réponses: 6
    Dernier message: 13/06/2009, 21h24
  3. Recherche de prix dans un fichier texte
    Par idoclub dans le forum Pascal
    Réponses: 6
    Dernier message: 18/03/2009, 17h03
  4. Recherche de palindromes dans un fichier texte
    Par dyala dans le forum Pascal
    Réponses: 4
    Dernier message: 25/05/2007, 19h10
  5. recherche de doublons dans un fichier texte
    Par portu dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 07/10/2003, 14h13

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