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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2015
    Messages : 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 émérite
    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
    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
    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 chevronné 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
    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

  5. #5
    Membre chevronné
    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
    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

  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
    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 chevronné 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
    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

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