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 :

scinder chaine de caracteres en en récupérant une partie


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 25
    Points : 18
    Points
    18
    Par défaut scinder chaine de caracteres en en récupérant une partie
    Bonjour,

    Après avoir consulté les pages du forum, je n'ai pas trouver de réponses à mon problème. Je précise que je suis complétement novice en PERL.
    Mon problème : j'ai une ressource linguistique de type dictionnaire qui est mal etiqueté et je voudrais la réétiqueter dans un nouveau format.

    Je pars de la structure :
    chaine de caractères, etiquette1,etiquette2,etiquette3
    (exemple : bateau, nom,singulier,locomotion)

    et je voudrais arriver à :
    chaine de caractères,etiquette1
    chaine de caractères,etiquette2
    chaine de caractères,etiquette3

    exemple : bateau,nom
    bateau,singulier
    bateau,locomotion

    Je voudrais donc que la premiere chaine de caractère soit reprise autant de fois qu'il y a d'étiquettes et sur des lignes différentes.
    Sur ce que j'ai vu sur les forums, c'est surtout la fonction SPLIT que je devrais utiliser mais n'étant pas du tout à même de programmer, je suis perdu.
    Si vous pouviez m'indiquer la procédure ou me renvoyer sur une page web expliquant la manip ce serait super.
    Merci d'avance
    P.

  2. #2
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Comme tu l'as dit, tu peux utiliser un split :

    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
    #!/usr/bin/perl -w
     
    use strict;
     
     
    my $string = 'bateau,nom,singulier,locomotion';
     
    # spécifique
    my ($data, $tag1, $tag2, $tag3 ) = split /,/, $string;
    print $data." : ".$tag1."\n";
    print $data." : ".$tag2."\n";
    print $data." : ".$tag3."\n\n";
     
    # général
    my @tab = split /,/, $string;
     
    for my $i (1..$#tab){
    	print $tab[0]." : ".$tab[$i]."\n";
    }
    Premier cas tu récupères tes 4 éléments dans 4 variables différentes
    Second cas, tu les récupères dans un tableau et tu fais une boucle du second (indice 1) au dernier élément ($#tab).

    Regarde la documentation de perldoc

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 25
    Points : 18
    Points
    18
    Par défaut MErci
    Bonsoir,
    Merci de cette réponse.
    J'ai testé, ça fonctionne parfaitement.
    P.

  4. #4
    Mr6
    Mr6 est déconnecté
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 607
    Points : 794
    Points
    794
    Par défaut
    Salut,

    Le même en ligne de commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -F, -lane 'print "$F[0] $F[$_]" for 1..$#F' mon_fichier.txt

    @+
    Mr6

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 25
    Points : 18
    Points
    18
    Par défaut Encore un petit détail technique SVP
    Rebonjour,

    J'ai réutilisé le script présenté plus haut. compte tenu que mes entrées de dictionnaires sont différentes à chaque fois donc que mon $data diffère, je pensais pouvoir utiliser une regex. J'ai ainsi modifié :
    my $string = /\w (,)\[A-Z].*(,);[A-Z].*(,)[A-Z].*(,);

    dans mon idée, le \w (,) correspond à mon entrée et les [A-Z].*(,) correspondent aux etiquettes qui, elles aussi, changent selon mon entrée de dictionnaire.

    Ca ne fonctionne pas et j'ai une erreur pour chacune de mes $tag...

    Si vous pouviez m'expliquer où ça cloche pour que je comprenne la logique ce serait l'idéal...
    Merci d'avance,
    Ph.

  6. #6
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    [A-Z] ne comprend que les majuscules, tu dois utiliser //i afin de rendre la recherche insensible à la casse.

    Tu dois mettre entre parenthèses ce que tu veux récupérer dans les variables et non les virgules.

    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my $string = 'bateau,nom,singulier,locomotion';
     
    my ($data, $tag1, $tag2, $tag3 ) = $string =~ m/(\w+),([A-Z]+),([A-Z]+),([A-Z]+)/i;

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Bonjour Mr6
    Merci pour ta réponse mais cela me donne l'erreur suivante :
    Can't find string terminator "'" anywhere before EOF at -e line 1.
    .....

  8. #8
    Mr6
    Mr6 est déconnecté
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 607
    Points : 794
    Points
    794
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -F, -lane "print \"$F[0] $F[$_]\" for 1..$#F" mon_fichier.txt
    version windows

    @+
    Mr6

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 25
    Points : 18
    Points
    18
    Par défaut Génial
    Super, ça fonctionne parfaitement.
    Encore merci
    Ph.

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

Discussions similaires

  1. [Débutant] comparer deux chaines de caractere a partir d'une base de donnees
    Par jeune informatique dans le forum MATLAB
    Réponses: 2
    Dernier message: 20/05/2010, 15h53
  2. chaine de caractere et arguments d'une commande
    Par vamos dans le forum Shell et commandes GNU
    Réponses: 8
    Dernier message: 02/01/2010, 21h01
  3. Réponses: 7
    Dernier message: 06/08/2008, 00h37
  4. Réponses: 1
    Dernier message: 08/09/2007, 17h12
  5. Verifier si une chaine de caractere est situe dans une chaine de caractere
    Par gregounnet dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/07/2007, 15h31

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