Extraction du titre et de chaque article du flux RSS de Le Monde dans un fichier XML et TXT.
Des fichiers XML qui sont les flux RSS, desquels on extrait le titre et la description.
Des fichiers TXT, qui sont donc des fichiers au format brut, que l'on extrait en format TXT, mais par rubriques.
Grâce aux indications, explications et exemples de nos professeurs nous avons pu réaliser un script utilisant le langage PERL et nous permettant d'obtenir les résultats attendus pour 4 rubriques du flux RSS du Journal Le Monde.
Traitant le titre et la description des articles (la surface).
#/usr/bin/perl
use warnings;
use strict;
<<DOC;
Votre Nom : COLLOMB-ALFONSO
JANVIER 2016
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
#----------------START-Arguments-Entree-(input)----------------
my $rep="$ARGV[0]";
my $rubrique = "3246|651865|3476|3260";
my %dico;
$rep=~ s/[\/]$//;
#----------------END-Arguments-Entree-(input)----------------
#----------------START-Declaration-Variables---------------
my $output1="2015-3246.xml";
my $output2="2015-651865.xml";
my $output3="2015-3476.xml";
my $output4="2015-3260.xml";
#----------------END-Declaration-Variables----------------
#----------------START-Enregistrement-Texte-Entete---------------
if (!open (FILEOUT,">$output1")) { die "Pb a l'ouverture du fichier $output1"};
print FILEOUT "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print FILEOUT "<PARCOURS>\n";
print FILEOUT "<NOM>ALFONSO-COLLOMB</NOM>\n\n";
close (FILEOUT);
if (!open (FILEOUT,">$output2")) { die "Pb a l'ouverture du fichier $output2"};
print FILEOUT "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print FILEOUT "<PARCOURS>\n";
print FILEOUT "<NOM>ALFONSO-COLLOMB</NOM>\n\n";
close (FILEOUT);
if (!open (FILEOUT,">$output3")) { die "Pb a l'ouverture du fichier $output3"};
print FILEOUT "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print FILEOUT "<PARCOURS>\n";
print FILEOUT "<NOM>ALFONSO-COLLOMB</NOM>\n\n";
close (FILEOUT);
if (!open (FILEOUT,">$output4")) { die "Pb a l'ouverture du fichier $output4"};
print FILEOUT "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print FILEOUT "<PARCOURS>\n";
print FILEOUT "<NOM>ALFONSO-COLLOMB</NOM>\n\n";
close (FILEOUT);
#----------------END-Enregistrement-Texte-Entete----------------
#----------------START-Appel-Fonction---------------
&parcoursarborescencefichiers($rep);
#----------------END-Appel-Fonction----------------
#----------------START-Enregistrement-Texte-Fil-RSS---------------
open (FILEOUT,">>:encoding(utf-8)", $output1);
print FILEOUT "</PARCOURS>\n";
close (FILEOUT);
open (FILEOUT,">>:encoding(utf-8)", $output2);
print FILEOUT "</PARCOURS>\n";
close (FILEOUT);
open (FILEOUT,">>:encoding(utf-8)", $output3);
print FILEOUT "</PARCOURS>\n";
close (FILEOUT);
open (FILEOUT,">>:encoding(utf-8)", $output4);
print FILEOUT "</PARCOURS>\n";
close (FILEOUT);
exit ;
#----------------END-Enregistrement-Texte-Fil-RSS----------------
#----------------START-Definition-Fonction---------------
sub parcoursarborescencefichiers
{
#definition du repertoire de lecture comme l'element passe en argument
my $path= shift(@_);
opendir (DIR, $path) or die "can't open $path: $!\n";
#definition d'une liste contenant le nom de chaque fichier du repertoire
my @files = readdir(DIR);
closedir (DIR);
#boucle permettant de parcourir la liste contenant le nom des fichiers
foreach my $file (@files)
{
#reconnaissance des lignes porteuses des informations pertinentes
next if $file =~ /^\.\.?$/;
#definition du chemin du fichier un par un
$file = $path."/".$file;
#condition verifiant si le repertoire existe et mémorise des
#balises dans le fichier de résultat en début et en fin
if (-d $file)
{
print "<NOUVEAU REPERTOIRE> ==> ",$file,"\n";
&parcoursarborescencefichiers ($file);
print "<FIN REPERTOIRE> ==> ",$file,"\n";
}
#condition verifiant si le fichier existe
if (-f $file)
{
#condition verifiant si le fichier correspond au numero de rubrique
if ($file =~ /($rubrique).+\.xml$/)
{
#implementation d'un compteur
my $numeroDerniereRubrique = $1;
print "<",$i++,"> ==> ",$file,"\n\n\n";
#definition de variables ouvrant des fichiers en mode d'ecriture
#dans un encodage UTF-8
$codage = "utf-8";
open (FIC, "<:encoding($codage)", $file);
open (OUT, ">>:encoding($codage)", "2015-$numeroDerniereRubrique.txt");
open (OUT2, ">>:encoding($codage)", "2015-$numeroDerniereRubrique.xml");
#definition de variable afin d'y ajouter le texte ligne par ligne
my $texte="";
#boucle parcourant chaque ligne de texte du fichier
while (my $ligne = )
{
#mise en forme de la ligne de texte
chomp $ligne;
$ligne =~ s/\r//g;
$texte = $texte . $ligne;
}
#fermeture du fichier
close FIC;
#mise en forme de la variable
$texte =~s/>\s+</></g;
#definition de compteur et boucle recherchant les
#elements titre et description dans le texte
my $compteurArticle = 1 ;
while ($texte =~m/<item>< title>([^<]+?)<\/ title>< link>(?:[^<]+?)<\/ link><description>([^<]+?)<\/description>/g)
{
#definition des variables et mise en forme des elements tite et description
my $titre = $1;
my $description = $2;
$titre=~s/<.+?>.+&.//g;
$titre.=".";
$titre=~s/\?\.$/\?/;
$description=~s/<.+?>//g;
#condition cherchant a eviter(supprimer) les doublons et a enregistrer dans
#le fichier resultat les balises et le contenu du compteur d'articles, du
#titre et de la description
if (!(exists $dico{$titre}))
{
$dico{$titre} = 1;
my $compteurArticle = $compteurArticle++;
print OUT "$titre\n";
print OUT "$description\n\n";
print OUT2 "<item num=\"$compteurArticle\" >\n< title>$titre</ title>\n<description>$description</description>\n</item>\n\n";
}
}
#fermeture des fichiers
close OUT;
close OUT2;
# fin de traitement du fichier
}
}
}
}
#----------------END-Definition-Fonction---------------
Traitant le titre et tout le contenu des articles (la profondeur), en plus de la surface.
#/usr/bin/perl
#use warnings;
#use strict;
<<DOC;
Votre Nom : COLLOMB-ALFONSO
JANVIER 2016
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
#----------------START-Arguments-Entree-(input)----------------
my $rep="$ARGV[0]";
my $rubrique = "3246|651865|3476|3260";
my %dico;
$rep=~ s/[\/]$//;
#----------------END-Arguments-Entree-(input)----------------
#----------------START-Declaration-Variables---------------
my $output1="2015-3246.xml";
my $output2="2015-651865.xml";
my $output3="2015-3476.xml";
my $output4="2015-3260.xml";
#----------------END-Declaration-Variables----------------
#----------------START-Enregistrement-Texte-Entete---------------
if (!open (FILEOUT,">$output1")) { die "Pb a l'ouverture du fichier $output1"};
print FILEOUT "\n";
print FILEOUT "<PARCOURS>\n";
print FILEOUT "<NOM>ALFONSO-COLLOMB</NOM>\n\n";
close (FILEOUT);
if (!open (FILEOUT,">$output2")) { die "Pb a l'ouverture du fichier $output2"};
print FILEOUT "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print FILEOUT "<PARCOURS>\n";
print FILEOUT "<NOM>ALFONSO-COLLOMB</NOM>\n\n";
close (FILEOUT);
if (!open (FILEOUT,">$output3")) { die "Pb a l'ouverture du fichier $output3"};
print FILEOUT "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print FILEOUT "<PARCOURS>\n";
print FILEOUT "<NOM>ALFONSO-COLLOMB</NOM>\n\n";
close (FILEOUT);
if (!open (FILEOUT,">$output4")) { die "Pb a l'ouverture du fichier $output4"};
print FILEOUT "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print FILEOUT "<PARCOURS>\n";
print FILEOUT "<NOM>ALFONSO-COLLOMB</NOM>\n\n";
close (FILEOUT);
#----------------END-Enregistrement-Texte-Entete----------------
#----------------START-Appel-Fonction---------------
&parcoursarborescencefichiers($rep);
#----------------END-Appel-Fonction----------------
#----------------START-Enregistrement-Texte-Fil-RSS---------------
open (FILEOUT,">>:encoding(utf-8)", $output1);
print FILEOUT "</PARCOURS>\n";
close (FILEOUT);
open (FILEOUT,">>:encoding(utf-8)", $output2);
print FILEOUT "</PARCOURS>\n";
close (FILEOUT);
open (FILEOUT,">>:encoding(utf-8)", $output3);
print FILEOUT "</PARCOURS>\n";
close (FILEOUT);
open (FILEOUT,">>:encoding(utf-8)", $output4);
print FILEOUT "</PARCOURS>\n";
close (FILEOUT);
exit ;
#----------------END-Enregistrement-Texte-Fil-RSS----------------
#----------------START-Definition-Fonction---------------
sub parcoursarborescencefichiers
{
#definition du repertoire de lecture comme l'element passe en argument
my $path= shift(@_);
opendir (DIR, $path) or die "can't open $path: $!\n";
#definition d'une liste contenant le nom de chaque fichier du repertoire
my @files = readdir(DIR);
closedir (DIR);
#boucle permettant de parcourir la liste contenant le nom des fichiers
foreach my $file (@files)
{
#reconnaissance des lignes porteuses des informations pertinentes
next if $file =~ /^\.\.?$/;
#definition du chemin du fichier un par un
$file = $path."/".$file;
#condition verifiant si le repertoire existe et enregistrant des
#balises dans le fichier de résultat en début et en fin
if (-d $file)
{
print "<NOUVEAU REPERTOIRE> ==> ",$file,"\n";
&parcoursarborescencefichiers ($file);
print "<FIN REPERTOIRE> ==> ",$file,"\n";
}
#condition verifiant si le fichier existe
if (-f $file)
{
#condition verifiant si le fichier correspond au numero de rubrique
if ($file =~ /($rubrique).+\.xml$/)
{
#implementation d'un compteur
my $numeroDerniereRubrique = $1;
print "<",$i++,"> ==> ",$file,"\n\n\n";
#definition de variables ouvrant des fichiers en mode d'ecriture
#dans un encodage UTF-8
$codage = "utf-8";
open (FIC, "<:encoding($codage)", $file);
open (OUT, ">>:encoding($codage)", "2015-$numeroDerniereRubrique.txt");
open (OUT2, ">>:encoding($codage)", "2015-$numeroDerniereRubrique.xml");
#definition de variable afin d'y ajouter le texte ligne par ligne
my $texte="";
#boucle parcourant chaque ligne de texte du fichier
while (my $ligne = <FIC>)
{
#mise en forme de la ligne de texte
chomp $ligne;
$ligne =~ s/\r//g;
$texte = $texte . $ligne;
}
#fermeture du fichier
close FIC;
#mise en forme de la variable
$texte =~ s/>\s+</></g;
#definition de compteur et boucle recherchant les
#elements titre et description dans le texte
my $compteurArticle = 1 ;
while ($texte =~m/<item>< title>([^<]+?)<\/ title>< link>(?:[^<]+?)<\/ link><description>([^<]+?)<\/description>/g)
{
#definition des variables et mise en forme des elements tite et description
my $titre = $1;
my $description = $2;
$titre=~s/<.+?>.+&.//g;
$titre.=".";
$titre=~s/\?\.$/\?/;
$description=~s/<.+?>//g;
#condition cherchant a eviter(supprimer) les doublons et a enregistrer dans
#le fichier resultat les balises et le contenu du compteur d'articles, du
#titre et de la description
if (!(exists $dico{$titre}))
{
$dico{$titre} = 1;
my $compteurArticle = $compteurArticle++;
print OUT "$titre\n";
print OUT "$description\n\n";
print OUT2 "- $compteurArticle\" >\n< title>$titre</ title>\n<description>$description</description>\n</item>\n\n";
}
}
#fermeture des fichiers
close OUT;
close OUT2;
# fin de traitement du fichier
}
#######################################################################################
#ICI COMMENCE LA SECTION DU SCRIPT EXCLUSIVE DE LA PROFONDEUR
#######################################################################################
#condition appelant le fichier TXT
if ($file =~ /($rubrique).+\.txt$/)
{
my $rubriquereconnnue=$1;
print "< PPPPPP",$i++,"> ==> ",$file,"\n\n\n";
#definition de variables ouvrant des fichiers en mode d'ecriture
#dans un encodage UTF-8
$codage = "utf-8";
open (FIC2, "<:encoding($codage)", $file);
open (OUT3, ">>:encoding($codage)", "Profond$rubriquereconnnue.txt");
#definition de variable afin d'y ajouter le texte ligne par ligne
my $texteProfond="";
#boucle parcourant chaque ligne de texte du fichier
while (my $ligne=<FIC2>)
{
#condition excluant des éléments présents dans les lignes de texte
if (($ligne!~/[<>\|]/))
{
#condition excluant des éléments présentas dans les lignes de texte
if (($ligne!~/^(\s|\n|Le Monde|Journaliste|Suivre|Aller|Lire|Suivre|\d\d.\d\d.\d\d\d\d|\/|\]|\}|\{|\\|require|Découvrir|Article sélectionné| la matinale|La sélection du|Voir aussi|Photo(s)?|Texte|(\()?function.|sdk.|Image|Rejouer|Accédez|GMURZYNSKA.|stall.|\"|\'|initCharts\)|\$.|if|Highcharts.|Réagir|Classer|Email|Partager)/))
{
#condition cherchant a eviter(supprimer) les doublons et a enregistrer dans
#le fichier resultat les balises et le contenu du compteur d'articles, du
#titre et de la description
if (!(exists $dico2{$ligne}))
{
$dico2{$ligne} = 1;
print OUT3 "$ligne\n";
}
}
}
}
#fermeture des fichiers
print OUT3 "\n*************************************************************\n";
close FIC2;
close OUT3;
}
}
}
}
#----------------END-Definition-Fonction---------------