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 :

Utilisation de split


Sujet :

Langage Perl

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2015
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Utilisation de split
    Bonjour,

    J'ai un fichier contenant des lignes dans un format alphanumérique comme ceci:

    122A32T23AGT44

    Je veux séparer la string en alpha et numérique. De plus, les caractères alpha doivent être séparés entre eux. Pour mon exemple ci-haut:

    122
    A
    32
    T
    23
    A
    G
    T
    44

    Je sais comment utiliser split avec un delimiter constant (pour la virgule pour un format csv). Je n'ai cependant aucune idée sur comment faire la séparation avec mon format actuel.

    Merci!

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    Salut,
    Ça semble plus simple de rechercher directement les éléments que le séparateur pour utiliser Split :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ echo "122A32T23AGT44" |perl -ne 'print join("\n", m/\d+|\w/g) . "\n"'
    122
    A
    32
    T
    23
    A
    G
    T
    44

  3. #3
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bravo pour cette réponse astucieuse, effectivement bien meilleure que ce que l'on peut imaginer avec split.

  4. #4
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    On peut très bien utiliser split. Il suffit de découper autour des caractères qui ne sont pas des chiffres.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Taisha:~/perl/forum $ perl -E 'say for split /(?<=\D)|(?=\D)/, "122A32T23AGT44"'
    122
    A
    32
    T
    23
    A
    G
    T
    44
    Taisha:~/perl/forum $
    l'expression régulière utilisée est une alternation (|) entre
    • (?<=\D) : zero-length positive look-behind sur \D, ce qui signifie que le caractère précédent n'est pas un chiffre
    • (?=\D) : zero-width positive look-ahead sur \D, ce qui signifie que le caractère suivant n'est pas un chiffre

    Le résultat est une assertion de largeur nulle qui découpe autour des lettres (précisément, des non-chiffres).
    La documentation standard est dans perlre
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  5. #5
    Membre confirmé
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    On peut aussi mettre des parenthèses dans le terme de recherche du split, ce qui retourne les séparateurs en plus des termes séparés.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    perl -e'print "$_\n" for split /(\D+)/,"122A32T23AGT44"'
    122
    A
    32
    T
    23
    AGT
    44
    There's nothing like $HOME!

  6. #6
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bien le coup des assertions positives avant et arrière de cmccmc, mais encore plus astucieux l'idée de Schmorgluck de la mise entre parenthèses du terme de recherche de split. Bravo et ++ à tous les deux.

  7. #7
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Citation Envoyé par Schmorgluck Voir le message
    On peut aussi mettre des parenthèses dans le terme de recherche du split, ce qui retourne les séparateurs en plus des termes séparés.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    perl -e'print "$_\n" for split /(\D+)/,"122A32T23AGT44"'
    122
    A
    32
    T
    23
    AGT
    44
    Non, ça ne marche pas parce que la spec initiale demande qu'on sépare les lettres... Donc en l'occurrence le + est de trop dans /(\D+)/ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Taisha:~/perl/forum $ perl -e'print "$_\n" for split /(\D)/,"122A32T23AGT44"'
    122
    A
    32
    T
    23
    A
     
    G
     
    T
    44
    Taisha:~/perl/forum $
    mais on se retrouve avec des chaînes vides entre les lettres, qu'il faut filtrer, par exemple avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Taisha:~/perl/forum $ perl -e'print "$_\n" for grep { $_ ne q{} } split /(\D)/,"122A32T23AGT44"'
    122
    A
    32
    T
    23
    A
    G
    T
    44
    Taisha:~/perl/forum $
    et ça devient un peu lourd
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  8. #8
    Membre confirmé
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Ah, oui, en effet. Donc la solution la plus simple est bien celle de __dardanos__ au bout du compte.
    There's nothing like $HOME!

  9. #9
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    La simplicité est dans l'oeil de l'observateur . Plus pertinent peut être, la version "match" semble sensiblement plus rapide que la version "split" (pour perl v14.2.1 sur linux, mais je doute que ça change significativement d'une version à l'autre):
    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
    35
    36
    37
    $ perl -MBenchmark="timethese,cmpthese" -e'for (1, 10, 100, 1000, 10000) { my $aa = 0; my $bb = 0; my $s = "A122A32T23AGT44" x $_; print "---- chaine de taille ", length($s), "\n"; $r = timethese( 1000000 / $_, { split => sub {++$aa for split /(?<=\D)|(?=\D)/, $s}, match => sub{++$bb for $s =~ m/(\d+|\w)/g}, } ); cmpthese $r; die if $aa != $bb or $aa != 10000000}'
    ---- chaine de taille 15
    Benchmark: timing 1000000 iterations of match, split...
         match:  8 wallclock secs ( 7.43 usr +  0.00 sys =  7.43 CPU) @ 134589.50/s (n=1000000)
         split: 11 wallclock secs (10.33 usr +  0.01 sys = 10.34 CPU) @ 96711.80/s (n=1000000)
              Rate split match
    split  96712/s    --  -28%
    match 134590/s   39%    --
    ---- chaine de taille 150
    Benchmark: timing 100000 iterations of match, split...
         match:  7 wallclock secs ( 6.59 usr +  0.00 sys =  6.59 CPU) @ 15174.51/s (n=100000)
         split:  9 wallclock secs ( 9.05 usr +  0.00 sys =  9.05 CPU) @ 11049.72/s (n=100000)
             Rate split match
    split 11050/s    --  -27%
    match 15175/s   37%    --
    ---- chaine de taille 1500
    Benchmark: timing 10000 iterations of match, split...
         match:  7 wallclock secs ( 6.53 usr +  0.00 sys =  6.53 CPU) @ 1531.39/s (n=10000)
         split:  9 wallclock secs ( 9.09 usr +  0.00 sys =  9.09 CPU) @ 1100.11/s (n=10000)
            Rate split match
    split 1100/s    --  -28%
    match 1531/s   39%    --
    ---- chaine de taille 15000
    Benchmark: timing 1000 iterations of match, split...
         match:  7 wallclock secs ( 6.52 usr +  0.00 sys =  6.52 CPU) @ 153.37/s (n=1000)
         split:  9 wallclock secs ( 9.08 usr +  0.00 sys =  9.08 CPU) @ 110.13/s (n=1000)
           Rate split match
    split 110/s    --  -28%
    match 153/s   39%    --
    ---- chaine de taille 150000
    Benchmark: timing 100 iterations of match, split...
         match:  7 wallclock secs ( 6.18 usr +  0.01 sys =  6.19 CPU) @ 16.16/s (n=100)
         split:  9 wallclock secs ( 8.77 usr +  0.01 sys =  8.78 CPU) @ 11.39/s (n=100)
            Rate split match
    split 11.4/s    --  -29%
    match 16.2/s   42%    --
    $
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

Discussions similaires

  1. utilisation sort, split, foreach besoins d'aide
    Par jameson dans le forum Programmation et administration système
    Réponses: 1
    Dernier message: 14/04/2009, 09h02
  2. Utilisation de split()
    Par lollipop69 dans le forum VB.NET
    Réponses: 3
    Dernier message: 17/02/2009, 00h57
  3. Conserver le motif utiliser dans split()?
    Par VinnieMc dans le forum Langage
    Réponses: 9
    Dernier message: 15/05/2007, 11h59
  4. probleme utilisation fonction split
    Par Lnmex dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 04/07/2006, 16h40
  5. [langage] utilisation de 'split'
    Par mimilou dans le forum Langage
    Réponses: 9
    Dernier message: 24/02/2004, 13h28

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