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 :

multiple substitutions de symboles


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 198
    Par défaut multiple substitutions de symboles
    Bonjour,

    On m'a donné un fichier texte sous le format ci-après pour en faire un fichier csv avec séparateur ";" en remplaçant les symboles
    \s
    <->
    ->
    :

    udp 10.63.29.130:59773->10.63.10.4:8040 0/1 48
    udp 10.63.29.130:42114->10.63.10.4:8040 0/1 24
    tcp 10.63.29.30:2591<->10.69.25.204:49192 97434/94677 120
    tcp 10.63.29.130:5666<->10.222.65.130:35023 9/8 24
    tcp 10.242.254.63:telnet<->10.252.16.215:59111 29/30 30
    udp 10.63.29.130:57000->10.63.10.4:8040 0/1 36
    tcp 10.63.29.30:10001<->10.239.8.17:60683 2153/2210 120
    tcp 10.63.29.30:2591<->10.239.8.17:60677 2/1 6
    ..............................

    J'ai fait ca qui fonctionne

    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
    my @input = @ARGV;
     
    foreach my $fichier (@input) {
     
    open my $fh, '<', "$fichier";
    open my $didierCSV , '>' , "didier.csv";
     
     
    while (my $ligne = <$fh>) {
     
    $ligne =~ s/\s/;/g;
    $ligne =~ s/\</;/g;
    $ligne =~ s/\-+/;/g;
    $ligne =~ s/\>+/;/g;
    $ligne =~ s/\:+/;/g;
    $ligne =~ s/\;+/;/g;
     
    print "$ligne\n";
     
    print $didierCSV "$ligne\n";
    }
     
    close $fichier;
    close $didierCSV;
    }

    Mais je n'arrive pas à indiquer de multiple possibilités (pas de OU, ET) avec les symbols <-> vu comme une seule pièce par exemple d'ou le fait de passer par x lignes de substitutions
    $ligne =~ s/\s/;/g;
    $ligne =~ s/\</;/g;
    $ligne =~ s/\-+/;/g;
    $ligne =~ s/\>+/;/g;
    $ligne =~ s/\:+/;/g;
    $ligne =~ s/\;+/;/g;
    La dernière étant pour éviter d'avoir ;;; à la place de <->

    Merci

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 198
    Par défaut
    Bon j'ai gagné au moins une ligne pour le moment avec le ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ligne =~ s/\s/;/g;
    $ligne =~ s/\b<?->\b/;/g;
    $ligne =~ s/\;+/;/
    g;

  3. #3
    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,
    Tu peux définir un choix avec un "|" ou en utilisant une classe [].

    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
    $ cat foo
    udp 10.63.29.130:59773->10.63.10.4:8040 0/1 48
    udp 10.63.29.130:42114->10.63.10.4:8040 0/1 24
    tcp 10.63.29.30:2591<->10.69.25.204:49192 97434/94677 120
    tcp 10.63.29.130:5666<->10.222.65.130:35023 9/8 24
    tcp 10.242.254.63:telnet<->10.252.16.215:59111 29/30 30
    udp 10.63.29.130:57000->10.63.10.4:8040 0/1 36
    tcp 10.63.29.30:10001<->10.239.8.17:60683 2153/2210 120
    tcp 10.63.29.30:2591<->10.239.8.17:60677 2/1 6
    $ perl -pe 's/(?!$)(?:[\s:]|\b<?->\b)/;/g' foo
    udp;10.63.29.130;59773;10.63.10.4;8040;0/1;48
    udp;10.63.29.130;42114;10.63.10.4;8040;0/1;24
    tcp;10.63.29.30;2591;10.69.25.204;49192;97434/94677;120
    tcp;10.63.29.130;5666;10.222.65.130;35023;9/8;24
    tcp;10.242.254.63;telnet;10.252.16.215;59111;29/30;30
    udp;10.63.29.130;57000;10.63.10.4;8040;0/1;36
    tcp;10.63.29.30;10001;10.239.8.17;60683;2153/2210;120
    tcp;10.63.29.30;2591;10.239.8.17;60677;2/1;6
    $

  4. #4
    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
    Si j'ai compris le problème, tu pourrais réorganiser l'ordre de tes substitutions, en commençant pas les plus longues. Trois substitutions devraient suffire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $ligne =~ s/<->/;/g;
    $ligne =~ s/->/;/g;
    $ligne =~s/[\s:]+/;/g;

  5. #5
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Voilà en plus condensé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ligne =~ s/(?:(?:[\s:]+|<?->))/;/g;
    Ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    udp;10.63.29.130;59773;10.63.10.4;8040;0/1;48;
    udp;10.63.29.130;42114;10.63.10.4;8040;0/1;24;
    tcp;10.63.29.30;2591;10.69.25.204;49192;97434/94677;120;
    tcp;10.63.29.130;5666;10.222.65.130;35023;9/8;24;
    tcp;10.242.254.63;telnet;10.252.16.215;59111;29/30;30;
    udp;10.63.29.130;57000;10.63.10.4;8040;0/1;36;
    tcp;10.63.29.30;10001;10.239.8.17;60683;2153/2210;120;
    tcp;10.63.29.30;2591;10.239.8.17;60677;2/1;6;

  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
    Citation Envoyé par djibril Voir le message
    Voilà en plus condensé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ligne =~ s/(?:(?:[\s:]+|<?->))/;/g;
    NB: j'avais bien vu que l'on pouvait condenser, mais j'essayais d'être pédagogique...

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

Discussions similaires

  1. multiplication de matrices utilisant des symboles
    Par Victor Stein dans le forum MATLAB
    Réponses: 5
    Dernier message: 01/12/2014, 19h49
  2. Réponses: 87
    Dernier message: 06/07/2011, 15h33
  3. Code ASCII du symbole Euro
    Par FW-S dans le forum Delphi
    Réponses: 9
    Dernier message: 03/04/2007, 01h27
  4. Création multiple table paradox dans le code
    Par scarabee dans le forum C++Builder
    Réponses: 8
    Dernier message: 30/10/2002, 10h17
  5. Réponses: 6
    Dernier message: 25/03/2002, 21h11

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