L'extraction des titres et descriptions est réalisée grâce à deux fonctions principales :
Une partie du script perl pour l'extraction sur un seul fichier avec expression régulière :
open my $input, "<:encoding(UTF-8)",$file;
$/=undef; # par défaut cette variable contient \n
my $ligne=<$input> ;
close($input);
# capter tous les éléments entre <titre></titre> et <description></descrptions>
# grâce aux () qui entresitre les données qu'on peut récupérer avec $1 et $2
# utiliser .+? pour ne pas être gourmand arrêter la capture juste avant </titre> et </descrption>
# L'indication /gs est pour prendre tous les items et ne pas s'arrêter au premier
while ($ligne=~/<item><title>(.+?)<\/title>.+?<description>(.+?)<\/description>/gs) {
my $titre=&nettoyage($1);
my $description=&nettoyage($2);
# ne pas prendre en compte les éléments qui se répètent
if (!(exists $dico_des_titres{$titre})) {
$dico_des_titres{$titre}=$description ;
# écire dans le fichier .txt
print $output "$titre \n";
print $output "$description \n";
print $output "----------------------------\n";
# écrire dans le fichier .xml
print $output2 "<item><titre>$titre</titre><description>$description</description>\n";
}
}
La fonction dans le script perl pour parcourir l'arborescence :
sub parcoursarborescencefichiers {
my $path = shift(@_);
my $rubrique = shift(@_);
my $output = shift(@_);
my $output2 = shift(@_);
my %dico_des_titres = shift(@_);
# ouvrir le dossier et lire le contenu dedans
opendir(DIR, $path) or die "can't open $path: $!\n";
my @files = readdir(DIR);
closedir(DIR);
# parcourir chaque élément
# !! important, trier tous les sous-dossiers et fichiers en ordre, car Perl ne traite pas forcément les fichiers en ordre
foreach my $file (@files) {
next if $file =~ /^\.\.?$/;
$file = $path."/".$file;
# si c'est un dossier, on conitue le parcours
if (-d $file) {
print "On entre dans le REPERTOIRE : $file \n";
&parcoursarborescencefichiers($file,$rubrique,$output,$output2,%dico_des_titres); #recurse!
print "On sort du REPERTOIRE : $file \n";
}
# si c'est un fichier, on lit le fichier
if (-f $file) {
# fonction d'extraction présentée ci-dessus
}
}
}
Pour traiter les 3 rubriques en une seule fois, j'ai enregitré les trois rubriques dans une liste,
et inséré la fonction de parcours-arborescence et la fonction d'extraction dans la boucle qui parcourt cette liste de rubriques.
Ce traitement est aussi réalisé dans le script python, l'exemple montré ci-dessous est celui de perl.
#obtenir l'extraction pour trois rubriques, en parcourant la liste des rubriques
foreach my $r (@RUBRIQUES){
# créer un dictionnaire vide qui enregistre les informations distingues (sans répétition) pour chaque rubrique
my %dico_des_titres=();
# créer un nouveau fichier .txt et un nouveau fichier .xml qui contient le numéro de rubrique
open my $output, ">:encoding(UTF-8)","$r-corpus-titre-description.txt";
open my $output2, ">:encoding(UTF-8)","$r-corpus-titre-description.xml";
print $output2 "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<corpus>\n";
# parcourir l'arborescence et trouver les informations dans la rubrique ciblée
# en prenant en compte les paramètres nom de l'arborescence, le numéro de rubrique, le fichier .txt, le fichier .xml,
# et le dictionnaire qui mémorise les informations déjà enregistrées
&parcoursarborescencefichiers($rep,$r,$output,$output2,%dico_des_titres);
print $output2 "</corpus>\n";
close $output;
close $output2;
}
Commande | Script |
---|---|
perl parcours-arborescence-fichiers-BAO1-2022.pl ../path/to/corpus/2021 3210 3244 3246 | |
pyhon3 parcour-arborescence-ficheirs_BAO1.py ../path/to/corpus/2021 3210 3244 3246 |