#!/usr/bin/perl use warnings; use strict; use Unicode::String qw(utf8); #use List::MoreUtils qw( each_array ); ######################################################################### ## PROGRAMME PRINCIPAL ######################################################################### #on lance le programme comme ceci : perl parcours.pl 2008/ print "répertoire de départ : $ARGV[0]\n"; my $racine="$ARGV[0]"; # On crée des fichiers globaux et les ouvre en écriture open (OUT1, ">:encoding(UTF-8)", "ALLsortietextebrut.txt") or die "Erreur : impossible d'ouvrir le fichier"; open (OUT2, ">:encoding(UTF-8)", "ALLsortiexml.xml") or die "Erreur : impossible d'ouvrir le fichier"; # On crée des variables qui stocke les contenus my $texte=""; my $encodage=""; # On déclare une variable de table vide qui stockera les noms des rubriques : my %dicorub=(); my %dicotitre=(); my %dicodescription=(); #On parcours alors l'arborescence pour extraire les rubriques ######################################################################### &recuprub($racine); ######################################################################### if( %dicorub eq 0 ) { #on vérifie que la table n'est pas vide print "%dicorub est vide"; } #print keys(%dicorub); #on initialise une liste contenant "la liste" des rubriques qui reprend les clef de la table. my @rubriques = keys(%dicorub); #tout les éléments de la liste se retrouve donc être tour à tour la variable $rub #et on crée des fichiers pour récupéré l'extraction de chacune des rubriques print @rubriques; foreach my $rub (@rubriques) { #print $rub; my $OUTRUB3="SORTIE_extraction_".$rub."_.xml"; open (OUTXMLRUB, ">:encoding(UTF8)",$OUTRUB3) or die "Pb a l'ouverture du fichier $OUTRUB3"; print OUTXMLRUB "\n"; print OUTXMLRUB "\n"; print OUTXMLRUB "\n"; print OUTXMLRUB "\n"; my $OUTRUB4="SORTIE_extraction_".$rub."_.txt"; open (OUTTXTRUB,">:encoding(UTF-8)",$OUTRUB4) or die "Pb a l'ouverture du fichier $OUTRUB4"; print OUTTXTRUB "Rubrique : ".$rub."\n"; print "RECUPRUB ET FICHIERS : DONE"; } ######################################################################### &recurse($racine); ######################################################################### my @rubriques = keys(%dicorub); foreach my $rub (@rubriques) { #print $rub; my $OUTRUB3="SORTIE_extraction_".$rub."_.xml"; open (OUTXMLRUB, ">>:encoding(UTF8)",$OUTRUB3) or die "Pb a l'ouverture du fichier $OUTRUB3"; print OUTXMLRUB "\n"; print OUTXMLRUB "\n"; close (OUTXMLRUB); } exit; ######################################################################### ## SOUS - PROGRAMMES ######################################################################### ######################################################################### ## RECUPERATION DES NOMS DE RUBRIQUES ######################################################################### sub recuprub { my $dossier=shift(@_); opendir(DOSSIER, $dossier) or die "can't open $dossier : $!\n"; my @fic = readdir(DOSSIER); closedir(DOSSIER); foreach my $fic(@fic) { next if $fic=~/^\.\.?$/; my $fic=$dossier."/".$fic; print $fic,"\n"; if (($fic eq ".") or ($fic eq "..")) { print "je suis sur . ou .. : je ne fais rien"; next }; if (-d $fic) { my $chemin=$dossier."/".$fic; &recuprub($fic); } if (-f $fic) { #print $fic,"\n"; my $encodage=""; open(IN, $fic); my $firstline=; if ( $firstline =~/encoding ?= ?[\"\']+([^\"\']+)[\'\"]+/i){ $encodage=$1; } print $encodage; #close(IN); if ($encodage ne "") { if ($fic=~/.*?.xml/){ open (IN, "<:encoding($encodage)", $fic); ## tableau des arguments entrés en ligne de commande while (my $ligne=){ #print $ligne; $ligne =~ s/\r/\n/g; $ligne =~ s/\n//g; $ligne=~s/> *|]([^<]+)<\/title>/g) { my $rub = nettoietexte($1); if (uc($encodage) ne "UTF-8") {utf8($rub);} #print $rub; ###### On nettoie les noms $rub =~ s/é/e/gi; $rub =~ s/é/e/gi; $rub =~ s/è/e/gi; $rub =~ s/ê/e/gi; $rub =~ s/à /a/gi; $rub =~ s/à/a/gi; $rub =~ s/- ?L. ?MONDE.FR//gi; #jusqu'à avril $rub =~ s/ ?: ?toute ?l' ?actualit. ?sur ?.. ?monde.f..? ?//gi; #changement mi-avril $rub =~ s/L. ?Monde.fr ?://gi; $rub =~ s/L. ?monde.f. ?- ?actualit.//gi; #changement décembre $rub =~ s/ //g; $rub =uc($rub); ## On les met en majuscule print $rub; $dicorub{$rub}++; ##Autovivification de la table de hachage (chaque rub est mise en clé avec une valeur de 1, évite les doublons) } } } #close(IN); print keys(%dicorub); } } } } ######################################################################### ## PARCOURS DE L'ARBORESCENCE ######################################################################### sub recurse { my $dossier=shift(@_); opendir(DOSSIER, $dossier) or die "can't open $dossier: $!\n"; my @files = readdir(DOSSIER); closedir(DOSSIER); #print "liste de fichiers de $dossier: @files\n"; foreach my $file(@files) { next if $file=~/^\.\.?$/; my $file=$dossier."/".$file; #print $file,"\n"; if (($file eq ".") or ($file eq "..")) { print "je suis sur . ou .. : je ne fais rien"; next }; if (-d $file) { my $chemin=$dossier."/".$file; &recurse($file); } if (-f $file) { if (($file=~/.*?.xml/) && ($file!~/^fil.+\.xml/)){ print $file, "\n"; my $encodage; open(IN, $file); my $ligne=""; $ligne=<IN>; if ($ligne=~ /encoding=[\"\']+([^\"\']+)[\'\"]+/) { $encodage=$1; } print $encodage, "\n"; #close(IN); if ($encodage ne "") { ###### Traitement des fichier xml en fonction de leur encodage : open (IN, "<:encoding($encodage)",$file); while (my $ligne=<IN>){ ###### On recherche la rubrique pour lui indiquer le fichier de sortie : $ligne =~ s/\r/\n/g; $ligne =~ s/\n//g; $ligne=~s/> *</></g; if ($ligne=~/[<channel>|<channel><atom:l..k.*?>]<title>([^<]+)<\/title>/g){ my $rub =$1; $rub = &nettoietexte($1); if (uc($encodage) ne "UTF-8") {utf8($rub);} $rub =~s/é/e/gi; $rub =~s/é/e/gi; $rub =~s/è/e/gi; $rub =~s/ê/e/gi; $rub =~s/à /a/gi; $rub =~ s/à/a/gi; $rub =~ s/- ?L. ?MONDE.FR//gi; $rub =~ s/L. ?monde.f. ?- ?actualit.//gi; $rub =~ s/ ?: ?toute ?l' ?actualit. ?sur ?.. ?monde.f..? ?//gi; $rub =~ s/L. ?Monde.fr ?://gi; $rub =~ s/ //g; $rub =uc($rub); print $rub, "\n"; my $OUTRUB3="SORTIE_extraction_".$rub."_.xml"; my $OUTRUB4="SORTIE_extraction_".$rub."_.txt"; open (OUTXMLRUB, ">>:encoding(UTF8)","$OUTRUB3") or die "Pb a l'ouverture du fichier $OUTRUB3"; open (OUTTXTRUB,">>:encoding(UTF-8)","$OUTRUB4") or die "Pb a l'ouverture du fichier $OUTRUB4"; open (OUT1, ">>:encoding(UTF-8)", "ALLsortietextebrut.txt") or die "Erreur : impossible d'ouvrir le fichier"; open (OUT2, ">>:encoding(UTF-8)", "ALLsortiexml.xml") or die "Erreur : impossible d'ouvrir le fichier"; while ($ligne=~/<item><title>(.*?)<\/title><l..k>.*?<\/l..k><description>(.*?)<\/description><enclosure.*?><pubDate>/g){ my $titre=$1; my $description=$2; if (uc($encodage) ne "UTF-8") {utf8($description);{utf8($titre);} $titre = &nettoietexte($1); $description = &nettoietexte($2); if (!(exists($dicodescription{$description}))){ print "TEST 1 : $titre \n"; print "TEST 2 : $description \n"; print OUT1 "$titre\n $description\n"; print OUT2 "<item>\n<titre>".$titre."<\/titre>\n<description>".$description."<\/description>\n<\/item>\n"; print OUTXMLRUB "<item>\n<titre>".$titre."<\/titre>\n<description>".$description."<\/description>\n<\/item>\n"; print OUTTXTRUB "$titre\n $description\n"; $dicodescription{$description}++; } } } } #close (IN); #print $file,"\n"; } } close (OUT1); close (OUT2); close (OUTXMLRUB); close (OUTTXTRUB); } } } } ######################################################################### ## NETTOYAGE DU TEXTE ######################################################################### sub nettoietexte { my $text=shift; $text =~ s/</</g; $text =~ s/>/>/g; $text =~s/<a href[^>]+>//g; $text =~s/<img[^>]+>//g; $text =~s/<\/a>//g; $text =~s/&#39;/'/g; $text =~s/&#34;/"/g; $text =~s/é/é/g; $text =~s/ê/ê/g; $text =~s/<[^>]+>//g; $text =~s/ / /g; $text =~s/&#38;/&/g; $text =~s/&#39;/'/g; $text =~s/&#34;/"/g; $text =~s/http.*?html//gi; return $text; }