Précédent   Forum du club des développeurs et IT Pro > Autres langages > Perl > Langage
Langage Toutes vos questions sur les scripts Perl en général. Avant de poster, veuillez consulter les FAQs perl, les cours Perl, les critiques de livres et les sources Perl.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 22/11/2012, 20h00   #1
pejji
Invité régulier
 
Homme PierJean
Étudiant
Inscription : 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 ?
pejji est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2012, 23h23   #2
Lolo78
Membre Expert
 
Homme Laurent R.
Conseil - Consultant en systèmes d'information
Inscription : mai 2012
Messages : 588
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 : 588
Points : 1 152
Points : 1 152
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;
}
__________________
Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.
Lolo78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2012, 08h50   #3
Philou67430
Expert Confirmé
 
Inscription : avril 2009
Messages : 2 678
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : avril 2009
Messages : 2 678
Points : 3 152
Points : 3 152
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.
Philou67430 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2012, 10h39   #4
pejji
Invité régulier
 
Homme PierJean
Étudiant
Inscription : 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
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).
pejji est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2012, 11h02   #5
Lolo78
Membre Expert
 
Homme Laurent R.
Conseil - Consultant en systèmes d'information
Inscription : mai 2012
Messages : 588
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 : 588
Points : 1 152
Points : 1 152
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.
__________________
Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.
Lolo78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2012, 12h16   #6
pejji
Invité régulier
 
Homme PierJean
Étudiant
Inscription : 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
Effectivement ... j'avais pas vu. Maintenant j'ai le droit à cette erreur :
Citation:
Global symbol "$FIC" requires explicit package name at Parseur.pl
pejji est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2012, 12h27   #7
Lolo78
Membre Expert
 
Homme Laurent R.
Conseil - Consultant en systèmes d'information
Inscription : mai 2012
Messages : 588
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 : 588
Points : 1 152
Points : 1 152
$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.
__________________
Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.
Lolo78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2012, 12h49   #8
pejji
Invité régulier
 
Homme PierJean
Étudiant
Inscription : 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
Merci beaucoup pour ton aide.
pejji est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 11h18.


 
 
 
 
Partenaires

Hébergement Web