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 en Perl d'un fichier txt


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 236
    Par défaut Parser en Perl d'un fichier txt
    Bonjour,

    Je souhaite faire un parser en Perl afin de parcourir un fichier, d'y récupérer des informations, puis les écrire dans un autre, pour l'instant quelque chose de basique..

    Je débute complétement le Perl donc je suis un peu perdu et mon code ne marche pas

    Par exemple mon fichier qui se faire lire par le parser est :

    aaaaatest32aaaaa
    zzzztest24zzzzz
    ztest12zzzzzz
    bbbbbbtest44
    Voici le début de 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
    17
    18
    #!usr/bin/perl -w 
    use strict; 
    user warning; 
     
    my $var1 = ""; 
     
    #print "Début du traitement" 
     
    open FICHIER,"<monfichier.txt" or die "E/S : $!\n"; 
    open ECRIRE,">montest.txt" or dir ("Erreur de création de  montest.txt"); 
    while (my $ligne = <FICHIER>){ 
     if ($ligne =~ /\s*(test\2w*)/{ 
     $var1 = "recherche du mot test dans la ligne " : $1; 
     } 
     
    close FICHIER; 
    close ECRIRE; 
    #print "Fin du traitement"


    Je voudrais donc que dans mon fichier montest.txt soit écrit :
    test32
    test24
    test12
    test44

    Merci d'avance pour votre aide pour corriger mon code qui ne fonctionne pas et d'éventuelle évolutions !

  2. #2
    Membre expérimenté
    Homme Profil pro
    Gérant infopsylon
    Inscrit en
    Juin 2010
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Gérant infopsylon
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 215
    Par défaut

  3. #3
    Membre expérimenté
    Homme Profil pro
    Gérant infopsylon
    Inscrit en
    Juin 2010
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Gérant infopsylon
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 215
    Par défaut
    Bonjour,

    le devrait plutot être
    Aussi, ton while n'a pas de '}' ...

    Ce sont des erreurs de copier-coller ?

    Aussi il faudrait penser à indenter ton code correctement, ce n'est vraiment pas lisible.

    Essai de voir avec ça
    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
     
    #!usr/bin/perl -w 
    use strict; 
    use warnings; 
     
    my $var1 = ""; 
     
    #print "Début du traitement" 
     
    open FICHIER,"<monfichier.txt" or die "E/S : $!\n"; 
    open ECRIRE,">montest.txt" or dir ("Erreur de création de  montest.txt"); 
    while (my $ligne = <FICHIER>)
    { 
        if ($ligne =~ /test[0-9]*/)
        { 
    	$ligne=~ s/.*(test[0-9]*).*/$1/;
    	 print "Mot  : $ligne \n"; 
        } 
    }
    close FICHIER; 
    close ECRIRE; 
    #print "Fin du traitement"

  4. #4
    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
    Il est également possible de remplacer ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        if ($ligne =~ /test[0-9]*/)
        { 
    	$ligne=~ s/.*(test[0-9]*).*/$1/;
    	 print "Mot  : $ligne \n"; 
        }
    par ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        if (my ($test) = $ligne =~ /(test\d+)/)
        { 
    	 print "Mot  : $test \n"; 
        }
    ce qui n'altère pas $ligne (note au passage que [0-9]* s'est transformé en \d+, notamment pour ne pas matcher le mot "test" sans chiffre à la suite).

  5. #5
    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
    Avec les commentaires
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        # Si la ligne contient "test" suivi éventuellement de chiffres ([0-9]*)
        if ($ligne =~ /test[0-9]*/)
        { 
            # Remplacer dans la ligne, tout ce qui se trouve autour de "test[0-9]*" (y compris ce motif) par ce motif
    	$ligne=~ s/.*(test[0-9]*).*/$1/;
             # Imprimer "Mot : " suivi de la nouvelle ligne
    	 print "Mot  : $ligne \n"; 
        }
    Et ma proposition:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        # Si le motif "test" suivi d'au moins un chiffre est trouvé, l'extraire dans $test et
        if (my ($test) = $ligne =~ /(test\d+)/)
        { 
             # imprimer "Mot : " suivi du motif trouvé
    	 print "Mot  : $test \n"; 
        }

  6. #6
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 236
    Par défaut
    Merci pour ta réponse, tout est bien sauf un petit soucis,

    Voici donc mon code actuel :

    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
     
    #!usr/bin/perl -w 
    use strict; 
    use warnings; 
     
    my $var1 = ""; 
     
    #print "Début du traitement" 
     
    #lire dans monfichier.txt 
    open FICHIER,"<monfichier.txt" or die "E/S : $!\n"; 
    #écrire dans mon test.txt
    open ECRIRE,">montest.txt" or dir ("Erreur de création de  montest.txt"); 
     
    #tant qu'il y a des lignes dans mon fichier
    while (my $ligne = <FICHIER>)
    { 
        # Si la ligne contient "test" suivi éventuellement de chiffres ([0-9]*)
        if ($ligne =~ /test[0-9]*/)
        { 
            # Remplacer dans la ligne, tout ce qui se trouve autour de "test[0-9]*" (y compris ce motif) par ce motif
    		$ligne=~ s/.*(test[0-9]*).*/$1/;
             # Imprimer "Mot : " suivi de la nouvelle ligne
    	 print "Mot  : $ligne \n"; 
        } 
     
    }
     
    #fermeture des fichiers
    close FICHIER; 
    close ECRIRE; 
    #print "Fin du traitement"
    Par contre quand je compile avec dans le cmd : perl parser.pl

    ll m'afficher a l'écran tout les print, me crée le fichier montest.txt mais il est vide

    Une idée ?

  7. #7
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 236
    Par défaut
    Merci pour vos réponses, c'est déjà mieux effectivement !
    Par contre pouvez vos m'expliquer avec des commentaires dans le code svp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    while (my $ligne = <FICHIER>)
    { 
        if ($ligne =~ /test[0-9]*/)
        { 
    	$ligne=~ s/.*(test[0-9]*).*/$1/;
    	 print "Mot  : $ligne \n"; 
        } 
    }
    Voila ce que j'arrive a comprendre ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    #tant qu'il y a des lignes dans le fichier
    while (my $ligne = <FICHIER>)
    { 
        #pourquoi [0-9]?
        if ($ligne =~ /test[0-9]*/)
        { 
    	 #ligne qui sera copié dans l'autre fichier mais c'est flou...
             $ligne=~ s/.*(test[0-9]*).*/$1/;
             # ??? écrit Mot : la valeur stocké dans ligne ?
    	 print "Mot  : $ligne \n"; 
        } 
    }
    Je suis vraiment débutant dans ce langage, merci pour vos futurs réponses.

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

Discussions similaires

  1. Comment parser un fichier.txt sous Access?
    Par takepaf dans le forum VBA Access
    Réponses: 5
    Dernier message: 31/05/2007, 11h15
  2. Parser un fichier txt
    Par takepaf dans le forum VBA Access
    Réponses: 1
    Dernier message: 29/05/2007, 11h29
  3. Réponses: 1
    Dernier message: 05/12/2006, 17h47
  4. Parser un fichier TXT
    Par Blaireau dans le forum Langage
    Réponses: 5
    Dernier message: 08/08/2006, 20h28
  5. [langage]parcours fichier txt en perl sous windows
    Par stef74 dans le forum Langage
    Réponses: 12
    Dernier message: 23/06/2005, 16h39

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