#/usr/bin/perl
<<DOC;
Nom : Olga Semenova
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
#-----------------------------------------------------------
#le nom du répertoire passe en argument au programme
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="";
#----------------------------------------
#on attribue le nom de fichier de sortie XML à la variable $output1
my $output1="RESULTAT-Filtrage.xml";
#on ouvre le fichier de sortie en mode d'écriture
#si le fichier ne peut pas être ouvert, le message introduit par "die" le signale
if (!open (FILEOUT,">$output1")) { die "Pb a l'ouverture du fichier $output1"};
#----------------------------------------
#on lance le parcours récursif de l’arbre des fils
&parcoursarborescencefichiers($rep); #recurse!
#----------------------------------------
#on formate la sortie : fichier XML avec entete
#on intègre le contenu de la variable contenant le filtrage
print FILEOUT "<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>\n";
print FILEOUT "<PARCOURS>\n";
print FILEOUT "<NOM>Votre nom</NOM>\n";
print FILEOUT "$DUMPFULL1\n";
print FILEOUT "</PARCOURS>\n";
close(FILEOUT);
exit;
#----------------------------------------------
##Procedure de parcours
sub parcoursarborescencefichiers {
my $path = shift(@_);
#On ouvre le répertoire
opendir(DIR, $path) or die "can't open $path: $!\n";
#On « récupère » le contenu du répertoire
my @files = readdir(DIR);
closedir(DIR);
#Pour chacun des « éléments » contenus dans le répertoire,
#on va vérifier son statut (répertoire -d ou fichier -f)
foreach my $file (@files) {
next if $file =~ /^\.\.?$/;
#On écrit le chemin complet de l’ « élément »
$file = $path."/".$file;
#Si l’ « élément » est un répertoire (-d = directory) : on relance le parcours
if (-d $file) {
&parcoursarborescencefichiers($file); #recurse!
}
#Si l’ « élément » est un fichier (-f = file) : on lance le traitement de filtrage
#dont le résultat est attribué à la variable $DUMPFULL1;
#on verifie si "élément" est un fichier
if (-f $file) {
#si oui, on l'ouvre
#et on l'associe à un pointeur FIC et à une variable $file;
open(FIC, $file);
#on commence à formater la sortie XML:
#pour que la variable $DUMPFULL1 imprime chaque fois le résultat du traitement,
on ajoute ".", l'opérateur de concaténation;
$DUMPFULL1 .= "<FICHIER>\n<NOM>$file</NOM>\n";
#parcours du fichier est associé au pointeur FIC;
#Chaque ligne est stockée dans la variable $ligne;
while ($ligne=<FIC>)
{
#On vérifie si la ligne contient le motif ci-dessous;
###Syntaxe de l'expession régulière:
#l'opérateur conditionnel =~ signifie "ressemble à"
#(.*) = on cherche un caractère quelconque sauf fin de ligne qui apparait 0 ou n fois
#g = on cherche dans tout le texte
#on n'oublie pas de
despécialiser
avec l'anti-slash le slash dans la balise fermante
if ($ligne=~/<description>(.*)<\/description>/g) {
#vu que $1 est une variable par défaut (elle désigne le contenu entre
parenthèses)on préfère la remplacer par une variable locale;
my $var=$1;
#si la ligne contient le motif indiqué ci-dessus, on procède au
remplacement des caractères accentués "mal affichés";
$var=~ s/&#39;/'/g;
$var=~ s/&#34;/"/g;
$var=~ s/ê/ê/g;
$var=~ s/é/é/g;
$var=~ s/ç/ç/g;
$var=~ s/è/è/g;
$var=~ s/Ã/à/g;
$var=~ s/à´/ô/g;
$var=~ s/é/é/g;
#on continue à formater la sortie par rajout du contenu des balises
<description>
$DUMPFULL1 .= "<CONTENU>$var</CONTENU>\n";
}
}
#on ferme la balise <FICHIER> qui boucle le résultat du traitement de chaque fichier;
$DUMPFULL1 .= "</FICHIER>\n";
#on utilise le "compteur" de fichiers qui s'affiche sur l'écran pour s'assurer
de la progression du traitement;
print $i++,"\n";
}
}
}
#----------------------------------------------