Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 8 sur 8
  1. #1
    Invité régulier
    Homme Profil pro PierJean
    Étudiant
    Inscrit en
    mai 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Nom : Homme PierJean
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2010
    Messages : 26
    Points : 6
    Points
    6

    Par défaut Parser plusieurs fichiers

    Bonjour,

    j'ai suivi le tuto http://djibril.developpez.com/tutoriels/perl/perl-xml/ pour parses un fichier XML et ça marche impeccable.

    Maintenant j'ai plusieurs fichiers XML dans un dossier et j'aimerai tous les parser.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #Ouverture du fichier
    $doc = 'ACDigest-AnnapolisCityDigest107788.xml';
    open(FIC, $doc) or die "Problème à l\'ouverture : $!";   
    #Parcours du fichier xml	 
    while(<FIC>){
    		#Survol des balises non intéressantes
           	next if (/xml/); next if (/AudioDoc/); next if (/Proc/);
            next if (/Channel/); next if (/Speaker/); next if (/Segment/);
            my @l =	split; #Split des balises Word
    		#comptage des occurences + mise en minuscule + suppr espaces
      		$mot=lc($l[4]);
      		#stemming
      		$mot = stem($mot);
    	   	$mot=~ s/\s+//g; # supprime les espaces
      		$mot =~ s/[;.,:-?!]$// ; # supprime la ponctuation
      		#suppression des mots outils
      		if ($stopword{$mot}) {$mot = ''};
     		#si le mot est différent de la chaine vide
      		if ($mot ne '') {$comptage{$mot} ++};	
    }
     
    # Fermeture des fichiers
    close($FhResultat);
    Une idée ?

  2. #2
    Expert Confirmé

    Homme Profil pro Laurent R.
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Nom : Homme Laurent R.
    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 : 1 265
    Points : 2 846
    Points
    2 846

    Par défaut

    Quelque chose comme cela (non testé), en supposant que tous les fichiers XML sont dans le répertoire courant:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    my @files = glob ("*.xml");
    foreach my $file (@files) {
         open my $FIC, "<", $file or die "ouverture impossible de $file $! \n";
         while (<$FIC> {
              next if /xml/ or /AudioDoc/ or /Proc/ or /Channel/ or /Speaker/ or /Segment/;
              # ... suite et fin du traitement du fichier XML courant
         }
         close $FIC;
    }
    Mes articles sur La programmation fonctionnelle en Perl publiés sur ce site:

    ________
    Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.

  3. #3
    Expert Confirmé

    Inscrit en
    avril 2009
    Messages
    3 026
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : avril 2009
    Messages : 3 026
    Points : 3 879
    Points
    3 879

    Par défaut

    Autre solution, si le traitement de tous les fichiers est équivalent au traitement de la concaténation de tous les fichiers :
    - tu passes en paramètre au script, la liste de tous les fichiers à traiter
    - tu utilises while (<>) au lieu d'ouvrir le fichier et d'utiliser while(<$FIC>)
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Using strict and warnings is good for you.

  4. #4
    Invité régulier
    Homme Profil pro PierJean
    Étudiant
    Inscrit en
    mai 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Nom : Homme PierJean
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2010
    Messages : 26
    Points : 6
    Points
    6

    Par défaut

    Merci pour vos réponses.
    Code :
    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
    my @files = glob ("*.xml");
    foreach my $file (@files) {
         open my $FIC, "<", $file or die "ouverture impossible de $file $! \n";
     
    #Parcours du fichier xml	 
    while(<FIC>){
    		#Survol des balises non intéressantes
           	next if /xml/ or /AudioDoc/ or /Proc/ or /Channel/ or /Speaker/ or /Segment/;
            my @l =	split; #Split des balises Word
    		#comptage des occurences + mise en minuscule + suppr espaces
      		$mot=lc($l[4]);
      		#stemming
      		$mot = stem($mot);
    	   	$mot=~ s/\s+//g; # supprime les espaces
      		$mot =~ s/[;.,:-?!]$// ; # supprime la ponctuation
      		#suppression des mots outils
      		if ($stopword{$mot}) {$mot = ''};
     		#si le mot est différent de la chaine vide
      		if ($mot ne '') {$comptage{$mot} ++};	
    }
     
    }
    #Affichage de la table de hachage triée par valeur
    foreach $key (sort { $comptage{$a} <=> $comptage{$b} } keys %comptage) {
    	$val = $comptage{$key};
    	print {$FhResultat} "Value:$val | Key:$key \n";
    }
    # Fermeture des fichiers
    #close($doc);
    close($FIC);
    close($FhResultat);
    Ca ne marche pas....

    Oui mes documents XML sont dans le même dossier (j'en ai 250).

  5. #5
    Expert Confirmé

    Homme Profil pro Laurent R.
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Nom : Homme Laurent R.
    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 : 1 265
    Points : 2 846
    Points
    2 846

    Par défaut

    Ton descripteur de fichier s'appelle $FIC (avec le signe '$'):

    Code :
    open my $FIC, "<", $file or die "ouverture impossible de $file $! \n";
    Et plus bas, tu cherches à lire FIC (sans le signe '$'):

    Change cette ligne:

    Il y a peut-être d'autres erreurs, mais celle-là était clairement bloquante,car tu ne lis même pas le fichier.
    Mes articles sur La programmation fonctionnelle en Perl publiés sur ce site:

    ________
    Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.

  6. #6
    Invité régulier
    Homme Profil pro PierJean
    Étudiant
    Inscrit en
    mai 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Nom : Homme PierJean
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2010
    Messages : 26
    Points : 6
    Points
    6

    Par défaut

    Effectivement ... j'avais pas vu. Maintenant j'ai le droit à cette erreur :
    Global symbol "$FIC" requires explicit package name at Parseur.pl

  7. #7
    Expert Confirmé

    Homme Profil pro Laurent R.
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Nom : Homme Laurent R.
    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 : 1 265
    Points : 2 846
    Points
    2 846

    Par défaut

    $FIC est déclaré dans le foreach. Tu le fermes trop tard, quand tu es sorti de la boucle foreach. Le "clsoe $FIC" n'est plus dans la portée lexicale de ta déclaration.

    Il faut le fermer entre la fin de la boucle while et la fin de la boucle foreach, c'est-à-dire ligne 20 dans ton code ci-dessus. Ce qui est logique, en principe tu veux fermer $FIC avant d'en ouvrir un autre.
    Mes articles sur La programmation fonctionnelle en Perl publiés sur ce site:

    ________
    Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.

  8. #8
    Invité régulier
    Homme Profil pro PierJean
    Étudiant
    Inscrit en
    mai 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Nom : Homme PierJean
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2010
    Messages : 26
    Points : 6
    Points
    6

    Par défaut

    Merci beaucoup pour ton aide.

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •