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 :

Efficacité substitution perl vs sed


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 51
    Par défaut Efficacité substitution perl vs sed
    Bonsoir à tous,
    Je voudrais régler un (petit) problème et je pense que perl (si mes souvenirs sont bons) est ce qu'il me faut pour ça.

    J'ai dans un répertoire des fichiers xml de cette forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a> blabla éléments divers </a>
    malheureusement, certains de ces fichiers sont mal-formés et l'élément <a> à été doublé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <a> blabla éléments divers</a>
    <a> blabla éléments divers</a>
    Je veux donc réparer cette erreur. Sachant que l'opération doit se faire sur plusieurs milliers de fichiers, je veux être sur que perl permet de faire ça efficacement (comparé à un sed par exemple), qu'en est t-il?

    Je n'ai pas de quoi tester mais théoriquement, je pense qu'en perl il faut faire un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s/(<a>.*<\/a>)<a>.*<\/a>/$1 *.xml
    ça vous parait correct?

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

    oui, Perl est tout-à-fait adapté pour faire ce genre d'opérations sur des milliers de fichiers. Traiter tous les fichiers d'un répertoire est un peu plus simple sous Unix que sous Windows, et la syntaxe d'appel ne sera pas tout-à-fait la même. Sous quel système es-tu?

    Mais ta syntaxe ne marchera pas vraiment dans ce cas-ci.

    D'après l'exemple que tu donnes, l'opération à faire semble être un simple dédoublonnage. Dans ce cas, inutile de recourir aux expressions régulière et à la fonction s///.

    Il suffit de lire chaque ligne du fichier en entrée et de l'imprimer sur la sortie si elle est différente de la précédente.

    La syntaxe sera à peu près la suivante (je ne peux pas tester dans l'immédiat dans le train):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -ni.bak -e 'print if $_ eq $old; $old = $_;' *.xml

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 51
    Par défaut
    Merci pour ta réponse.
    Cependant, dans mon cas, et l'exemple que j'ai donné n'est peut être pas bien choisi, le éléments <a> peuvent prendre plusieurs lignes!

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <a>
    <b/>
    <c/>
    </a>
    <a>
    <b/>
    <c/>
    </a>
    Aussi, je veux que la modification se fasse dans le fichier;
    j'ai réussi à obtenir le résultat escompté mais je ne sais pas comment faire pour que la modification se fasse dans le fichier.
    voici ce que je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $/ = undef;
    $text=<>;
    $text=~ s/(<a>.*?</a>)\n<a>.*?</a>/$1/gms
    # l'option s sert à ce que le \n puisse être matché
    print $text
    donc ce truc fonctionne, mais je n'ai le résultat que sur la sortie standard, et je crains de perdre beaucoup en efficacité si je l'écris dans un fichier temp que je renomme ensuite.

    Je me demande si il y'a d'autre moyen de faire? je pense que ma façon de régler le problème n'est déjà pas optimale

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 51
    Par défaut
    Ah, et je suis sous Unix bien sur quand je bosse avec perl

  5. #5
    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
    L'option -i.bak que j'ai utilisée dans ma proposition permet de remplacer directement dans le fichier ("en place"), et de garder l' fichier d'origine avec l'extension ".bak". Cela dit, avec cette option, Perl créee un fichier temporaire et assure lui-même les renommages qui vont bien. C'est bien utile pour de spetits scripts inilignes, pour des programmes un peu plus compliqués,tu peux aussi bien gérer toi-même.

Discussions similaires

  1. substitution perl -p0e
    Par tiboo dans le forum Langage
    Réponses: 1
    Dernier message: 30/01/2008, 14h58
  2. substitution :sed + $HOME
    Par flouille dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 07/12/2007, 09h12
  3. Perl et Sed dans un fichier
    Par Exo dans le forum Langage
    Réponses: 1
    Dernier message: 05/10/2007, 14h23
  4. Substitution en perl
    Par _Moa_ dans le forum Langage
    Réponses: 11
    Dernier message: 22/05/2007, 08h57
  5. [langage] awk et sed dans script perl
    Par scoti dans le forum Langage
    Réponses: 3
    Dernier message: 07/04/2003, 18h26

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