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 :

Parsing d'un fichier


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Par défaut Parsing d'un fichier
    Bonjour,

    Comment fait-on pour supprimer toutes les lignes d'un fichier qui ne contient pas de balises sinon on les laisse et on garde aussi les espaces qu'il y a ?

    Merci

  2. #2
    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
    Bah c'est à toi de le faire.
    Et un exmple ne ferait pas de mal

  3. #3
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Par défaut
    Citation Envoyé par djibril Voir le message
    Bah c'est à toi de le faire.
    Et un exmple ne ferait pas de mal
    J'ai obtenu ce que je souhaitais de cette manière :
    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
    #!/usr/bin/perl
     
    sub Supression {                                                                                                                                                                                                                              
      my ($file) = @_;                                                                                                                                                                                                                              
      my $temp = "$file.bak";                                                                                                                                                                                                                       
      rename($file, $temp);
     
      open NOUVEAU, '>', $file;                                                                                                                                                                                                                     
      open ANCIEN,  '<', $temp;                                                                                                                                                                                                                                             
     
      while(<ANCIEN>) { # ligne stockée automatiquement dans $_                                                                                                                                                                                     
    	if ($_ !~ /^\s*<.*>(.*<\/.*>\s*)*$/)
    	{
    		next;
    	}
    	else
    	{
    		print NOUVEAU;
    	}
      }                                                                                                                                                                                                                                          
      close ANCIEN;                                                                                                                                                                                                                                 
      close NOUVEAU;                                                                                                                                                                                                                                
      unlink $temp;                                                                                                                                                                                                                                
    }
     
    Supression("example.xml");
    Maitenant je voudrais remplacer les lignes :
    <toto></toto> -> <toto />
    <titi></titi> -> <titi />
    et dans le cas ou les balises contiennent des données, on ne fait rien.
    Dans ma boucle while, j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    while(<ANCIEN>) { # ligne stockée automatiquement dans $_                                                                                                                                                                                     
    	if ($_ = /^\s*<.*>.*<\/.*>\s*$/)
    	{
    		$_ = s/^\s*<(.*)>.*<\/.*>\s*$/^\s*<$1 \/>\s*$/ ;
    		print NOUVEAU;
    	}
    	else
    	{
    		next;
    	}
      }
    mais j'obtiens comme erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Final $ should be \$ or $name at modif_balise.pl line 15, within string syntax error at modif_balise.pl line 15, near "= s/^\s*<(.*)>.*<\/.*>\s*$/^\s*<$ 1 \/>\s*$/"
    Execution of modif_balise.pl aborted due to compilation errors.

  4. #4
    Membre chevronné Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Par défaut
    Dans la deuxième partie de la substitution, ça n'a pas de sens d'utiliser les quantificateurs * ? + et les ancres les ancres ^ $. L'erreur vient de là.

    De plus, tu utilises des quantificateurs gloutons (greedy) .* ; cela risque de poser des problèmes car le moteur de regex va matcher au maximum (tout jusqu'au dernier > de la ligne dans ton cas). Utilise la version non-gloutonne: .*?

    Si j'ai bien compris, en fait tu veux simplement quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -ple 's|<(.*?)></\1>|<$1 />|g' old > new
    Je te conseille d'utiliser un vrai parseur, à moins que ton code XML soit vraiment ultra simple et régulier et limité à un nombre très restreint de cas de figure.

  5. #5
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Par défaut
    Citation Envoyé par iblis Voir le message
    Dans la deuxième partie de la substitution, ça n'a pas de sens d'utiliser les quantificateurs * ? + et les ancres les ancres ^ $. L'erreur vient de là.

    De plus, tu utilises des quantificateurs gloutons (greedy) .* ; cela risque de poser des problèmes car le moteur de regex va matcher au maximum (tout jusqu'au dernier > de la ligne dans ton cas). Utilise la version non-gloutonne: .*?

    Si j'ai bien compris, en fait tu veux simplement quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -ple 's|<(.*?)></\1>|<$1 />|g' old > new
    Je te conseille d'utiliser un vrai parseur, à moins que ton code XML soit vraiment ultra simple et régulier et limité à un nombre très restreint de cas de figure.
    Oui le code XML est simple et régulier c'est pour ça que je ne passe pas par un parseur et je ne sais pas vraiment manipuler un parseur.

    Pour la ligne de code que tu as mis c'est bien ce que je souhaite

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

Discussions similaires

  1. Parsing d'un fichier
    Par Premium dans le forum C
    Réponses: 27
    Dernier message: 18/05/2006, 18h34
  2. Erreur d'évaluation (parse) dans le fichier web.xml de l'application
    Par popinenhbourg dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 15/05/2006, 15h38
  3. Parsing d'un fichier texte
    Par anibal dans le forum C
    Réponses: 2
    Dernier message: 18/04/2006, 14h33
  4. Réponses: 3
    Dernier message: 16/02/2006, 18h38
  5. [DOM] Erreur lors du parsing d'un fichier XML par l'API DOM
    Par patricetoan dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 26/09/2005, 12h43

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