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] récupération d'une chaine


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] récupération d'une chaine
    Bonjour,

    j'ai un petit probleme étant un noob de chez noob en perl, je bloque sur un truc tout con

    ça serai pour recupérer un bout de chaine de caractere dans un fichier

    j'ai cette chaine là :

    "objet : event notification for: Help Desk Call #20378"

    Je voudrais juste recupéré les caracteres en gras. Le probleme ces que ces derniers ne sont pas fixes, la longueur de cette chaine est variables.

    J'ai deja commencé en faisant une recherche sur "Help Desk" pour savoir où commencer mais apres je bloque

    Peu etre que j'utilise pas la bonne méthode?

  2. #2
    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,

    Tu peux utiliser les expressions régulières pour cela.

    si le motif qui t'interesse est toujours à la fin.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    while (<F>) {
     
    $_ =~ /Help Desk\s+(.+)$/;
    my $motif = $1;
     
    }
    c'est une expression un peu grossiere. tu peux affiner la reconnaissance de ton motif car .+$ prend n'importe quel caractere jusquà la fin.

    tiens nous au courant

  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
    Je te remercie pour ta reponse, j'avance un petit peu plus sur mon projet grace à toi

    Je voudrai savoir par contre pour une phrase qui se trouve a la ligne suivante
    genre :

    Problem Description:
    Tout est planté (test)


    Quelles expressions regulieres utilisées?
    Parsque j'ai un peu de mal avec elles [/b]

    Ou encore une ligne entre deux lignes ex :

    Pb :

    salut toi

    fin.

    ça ne serai pas plus simple non à coder?

  4. #4
    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
    Je ne pretend pas en quelque ligne te donner la meilleure façon d'utiliser les expressions régulières.

    pour un motif precis je peux essayer de te faire un ligne mais sit u veux mieux appréhender cette technique, rien ne vaut la lecture de tutoriaux. ils sont là pour ça.
    http://www.enstimac.fr/Perl/DocFr/perlrequick.html
    http://www.enstimac.fr/Perl/DocFr/perlretut.html

    bonne lecture

  5. #5
    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
    Merci pour ces lien

  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
    Pour :

    "objet : event notification for: Help Desk Call #20378"

    on pourrai aussi faire cela non?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $_ =~ /Help Desk/ ;
    $call = $' ;
    Enfin tu me corriges si je me trompe ^^;

    Par contre comment faire pour utiliser la variable $' plusieur fois ?
    Car je voudrai en faite faire plusieurs extractions dans mon fichier, il n'y a pas une methode pour libérer une variable?

  7. #7
    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
    ça débute et ça fait le malin avec les variables spéciales

    je crois que $' c'est la fin de ligne apres le match donc ça doit être la même chose.

    en fait qd tu fais ton while, il lit le fichier ligne par ligne donc ta variable est libérée (écrasée) à chaque fois. mais c'est le cas de $call aussi.

    la solution est de les stocker dans un tableau.

    si tu initialise tes varaibles avec my, faut linitialiser le tableau en dehars du while bien sur.

  8. #8
    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
    Attention, toutefois, avec l'usage des variables spéciales !!!

    $` ($PREMATCH), $& ($MATCH) et $' ($POSTMATCH) sont certes pratiques, mais elles introduisent un surcoût phénoménal dans les performances de recherche des expressions rationnelles.

    C'est pourquoi il peut être préférable de construire un motif cohérent à base de regroupements (motifs entre parenthèses) et de récupérer derrière les $1, $2, etc.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  9. #9
    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 vous remercie

    parcontre j'ai toujours un probleme

    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;
     
    my ( @call, @id1, @id2, $fav) ;
    $fav = "toto.txt";
     
    open AVANT, $fav or die "Impossible d'ouvrir $fav\n";
           while (<AVANT>) {
                   #recherche du numero de la demande
                   $_ =~ /Help Desk Call\s+(.+)$/;
                    push @call, $1;
     
                    #recherche de l'id1
                    $_ =~ /Opened By\s+(.+)$/;
                    push @id1, $1;   
     
                    #recherche de l'id2
                    $_ =~ /Sent To\s+(.+)$/;
                    push @id2, $1;         
                                        }
    print ("\nObjet : Enregistrement de la demande n° @call \n");
    print ("Ouvert par :     @id1 \n");
    print ("Envoyé par :    @id2  \n");
     
    close AVANT;
    Mon fichier avant se presente comme cela :

    Objet Notification For: Help Desk Call #20378

    Opened by: toto
    Sent to: inconnu
    j'ai voulu voir ce que contenait les tableaux et là je comprend pas trop

    @call contient 9 fois #20378 + toto
    @id1 contient 8 fois #20378 + 2 fois toto
    @id2 contient 8 fois #20378 + toto + inconnu


  10. #10
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Je parierai que ton fichier compte plus de ligne que ça, non ?

    En fait le problème vient du fait que tu ne testes pas si la ligne correspond bien à ton motif avant de faire le push... Il faut que tu fasses plutôt ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    push @call, $1 if /Help Desk Call\s+(.+)$/;
    (de même pour les autres motifs bien sûr)

    --
    Jedaï

  11. #11
    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
    Haaa c'est genial ça marche (dsl, l'émotion, c'est pas souvent que ça m'arrive )

    Un grand merci a tout le monde vous m'avez bien aider, faut dire j'était trop dans la mouise, jsuis vraiment pas fait pour etre dévelopeur, mais je m'accroche quand meme

    Bon y me resque encore un petit probleme à régler pour ce qui concerne, l'extraction d'une variable entre 2 lignes.

    Je vais allez tater du google sur les expressions regulieres et rationelles.
    Il faut que je finisse demain sinon j'aurrai jamais le temps de finir mon projet dans les délais impartits

  12. #12
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Un petit tag résolu la prochaine fois quand c'est bon !

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 06/11/2007, 12h36
  2. [langage] supprimer le "/" à la fin d'une chaîne
    Par sommerset dans le forum Langage
    Réponses: 2
    Dernier message: 29/03/2005, 14h41
  3. [langage] cherche script pour formater une chaine
    Par MASSAKA dans le forum Langage
    Réponses: 7
    Dernier message: 12/11/2003, 12h18
  4. [langage] Retirer le premier caractère d'une chaine ?
    Par kwisach dans le forum Langage
    Réponses: 5
    Dernier message: 24/04/2003, 11h05
  5. langage] Découper une chaine suivant un délimiteur
    Par totox17 dans le forum Langage
    Réponses: 2
    Dernier message: 25/11/2002, 16h25

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