Il faut construire un programme en perl qui est capable de faire les actions suivant:
§ parcourir une arborescence de fichiers;
§ filtrer les contenus textuels des balises DESCRIPTION et TITLE contenues dans les balises ITEM;
§ nettoyer le corpus et le sauvgarder en forme .txt et .xml.
Cette partie de programme barse ensemble des répretoires et cherche tous les fichiers en forme XML en respectant le nom de repertoire que nous lui avons donné.
#---------------------------------------------------------------
#Etape 1: je veux recuperer tous les fichier dans le repertoire
#---------------------------------------------------------------
my $repertoire = "$ARGV[0]"; #l'adresse de repertoire
%dico; #hash
#cree les fichiers pour stoker le texte
open (OUTPUT, ">:encoding(utf8)", "output1.txt") or die "NE PEUT PAS OUVIRE LE FICHIER !";
open (OUTPUT1, ">:encoding(utf8)", "output1.xml") or die "NE PEUT PAS OUVIRE LE FICHIER !";
print OUTPUT1 "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print OUTPUT1 "<PARCOURS>\n";
print OUTPUT1 "<NOM>Yuran ZHAO et Mingqiang WANG</NOM>\n";
#print OUTPUT "<FILTRAGE>".$DUMPFULL1."</FILTRAGE>\n";
print OUTPUT1 "</PARCOURS>\n";
&parcours($repertoire); #appeller la fonction qui recupeter tous les fichies qu'on a besoin dans un repertoire arborescence et les traiter
close OUTPUT;
close OUTPUT1;
sub parcours
{
my $path = shift(@_); #shift ==> retourne le premier element d'une liste
# @_ ===> une liste
#je veux ouvrir la liste de mon repertoire
opendir(DIR, $path) or die "NE PEUT PAS OUVIRE LE REPERTOIRE !";
#je veux le lire
my @file = readdir(DIR);
closedir(DIR);
foreach my $file (@file)
{
my @fichier = (@_);
next if $file =~ /^\.\.?$/; #j'ignore le cas : nom de fichier est . ou ..
# avec "=~" on peut lire un variable qui contient une expression reguliere
$file = $path."/".$file;
$fichier = $file;
if (-d $file) #-d ==> test si $file a un repertoire (qui a une liste)
{
print " ========> ",$file,"\n";
&parcours($file); #recurse!
print " =========> ",$file,"\n";
}
La partie suivante consiste à traiter les informations recueillies
#----------------------------------------------------------------------------------
#Etape 2: je veux traiter tous les fichiers que on a trouvé : filtrage et nettoyager
#----------------------------------------------------------------------------------
if (-f $file) #-f ==>verifier si $file est un fichier normal
{
#je veux travaille sur uniquement les fichier xml
if ($file =~ /$rubrique.+\.xml/)
{
#je ouvert ce fichier
print "$file\n";
open (INPUT, "<:encoding(utf8)", $file);
#je cree un variable vide pour stoker le contenu
open (OUTPUT, ">>:encoding(utf8)", "$rubrique.txt") or die "NE PEUT PAS OUVIRE LE FICHIER !";
open (OUTPUT1, ">>:encoding(utf8)", "$rubrique.xml") or die "NE PEUT PAS OUVIRE LE FICHIER !";
my $texte = "";
while (my $ligne =<INPUT>) #filtrage
{
chomp $ligne; #supprime le retour de ligne
$ligne =~s/\r//g; #enleve tous les "\r"
$texte = $texte.$ligne;
}#while
close INPUT;
#je ne veux pas l'espace entre les chevrons
$texte =~ s/< +</<</g;
$description =~ s/<.+?>//g;
$title =~ s/&//g;
$description =~ s/xE[0-9]//g;
#sortir-la-partie-"title"-et-"description"
while ($texte =~ m/<item<<link<(?:[^<]+?)<\/link<<title<([^<]+?)<\/title<<description<([^<]+?)<\/description</g)
{
my $title = $2;
my $description = $3;
#-----------------------------------------------------------------------------------
# nettoyage
#-----------------------------------------------------------------------------------
$description =~ s/<.+?>//g;
$title =~ s/&//g;
$description =~ s/xE[0-9]//g;
#------------------------------------------------------------------------------------
if (!(exists $dico{$title}))
{
#my ($xmltitle,$xmldescription) = &etiquette($title,$description); #appelle fonction etiquette
$dico{$title} = 1; #la valeur correspondant à la clef $titre est 1
print OUTPUT "$file\n";
print OUTPUT "$title\n";
print OUTPUT "$description\n";
print OUTPUT1 "<name> $file <\/name>\n";
print OUTPUT1 "<item><title>$title<\/title><description>$description<\/description><\/itme>";
}#if
}#while
close OUTPUT;
close OUTPUT1;
}#if
}#if
Pour voir le script complet, cliquez sur le lien suivant