Série 1 : Perl


Trinquier Aurélia

A partir d'une arborescence de fichiers xml (un ensemble de fils rss issus du Monde) il s'agit de créer un script Perl permettant d'extraire le contenu des balises descriptions.
Appliqué sur le dossier 2005 on obtient en sortie le fichier SORTIE.xml
Puis en lui appliquant une feuille de style on obtient cette visualisation.

Le programme :

#/usr/bin/perl
<<DOC;
Votre Nom :
JANVIER 2005
usage : perl parcours-arborescence-fichiers repertoire-a-parcourir
Le programme prend en entrée le nom du répertoire contenant les fichiers
à traiter
Le programme construit en sortie un fichier structuré contenant sur chaque
ligne le nom du fichier et le résultat du filtrage :
<FICHIER><NOM>du fichier</NOM></FICHIER><CONTENU>du filtrage</CONTENU></FICHIER>
DOC


print "Quelle est la balise à filtrer?\n" ;
$exp=<STDIN> ;
chomp $exp ;
#-----------------------------------------------------------
my $rep="$ARGV[0]";
# on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
# on initialise une variable contenant le flux de sortie
my $DUMPFULL1="";
#----------------------------------------
my $output1="BaO1.xml";
if (!open (FILEOUT,">$output1")) { die "Pb a l'ouverture du fichier $output1"};
print FILEOUT "<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>\n<?xml-stylesheet type=\"text/xsl\" href=\"Style.xsl\"?>\n";
print FILEOUT "<PARCOURS>\n<Nom>Aurélia Trinquier</Nom>\n";

#----------------------------------------
&parcoursarborescencefichiers($rep); #recurse!
#----------------------------------------

sub parcoursarborescencefichiers {
my $path = shift(@_);
opendir(DIR, $path) or die "can't open $path: $!\n";
my @files = readdir(DIR);
closedir(DIR);
foreach my $file (@files) {
next if $file =~ /^\.\.?$/;
$file = $path."/".$file;
if (-d $file) {
&parcoursarborescencefichiers($file); #recurse!
}
if (-f $file) {
# TRAITEMENT à réaliser sur chaque fichier
# Insérer ici votre code (le filtreur)

open (FILEINPUT,"$file") ;
print FILEOUT "<FICHIER>\n<NOM>$file</NOM>\n";
while ($ligne = <FILEINPUT>){
if ($ligne=~/<$exp>(.*)<\/$exp>/) {
$ligne=$1;

# Rectification des problèmes de codage
$ligne=~s/(&#39;)/\'/g;
$ligne=~s/(&#34;)/\"/g;
$ligne=~s/à©/é/g;
$ligne=~s/é/é/g;
$ligne=~s/ê/ê/g;
$ligne=~s/è/è/g;
$ligne=~s/Ã/à/g;
$ligne=~s/ç/ç/g;
$ligne=~s/à§/ç/g;
$ligne=~s/à´/ô/g;
$ligne=~s/(é)/é/g;
$ligne=~s/(ê)/ê/g;

print FILEOUT "<FILTRAGE>$ligne</FILTRAGE>\n";

}
}

print FILEOUT "</FICHIER>\n" ;
close (FILEINPUT);
}
}
}

print FILEOUT "</PARCOURS>\n";
close(FILEOUT);
exit;