#/usr/bin/perl use Unicode::String qw(utf8); ##On charge le module unicode::string <. Remarque : la construction de ce programme s'appuie sur les scripts donnés en cours : parcours-arborescence-fichiers.pl, filtreur.pl & nettoyeur.pl DOC #----------------------------------------------------------- #récupère le chemin du répertoire à parcourir my $rep="$ARGV[0]"; # on s'assure que le nom du répertoire ne se termine pas par un "/" $rep=~ s/[\/]$//; # Initialisation des différentes variables my $DUMPXML=""; my $DUMPTXT=""; my $DUMPTMP=""; # numéro & nom de la rubrique, date de l'article traité my $num=""; my $rubrique=""; my $date=""; my %dictionnairedesrubriques=(); # dialogue avec l'utilisateur print "\nBonjour, vous êtes sur le nettoyeur de fils RSS du journal \"Le Monde\" !\n\n"; print "Entrez l'identifiant de la rubrique a traiter ou * si vous voulez toutes les rubriques : \n"; print "0 : A la une\t\t\t\t8 : Medias\n 1 : International\t\t\t9 : Rendez-vous\n 2 : Europe\t\t\t\t10 : Sports\n 3 : Livres\t\t\t\t11 : Opinions\n 4 : Cinema\t\t\t\t12 : Planete\n 5 : Technologies\t\t\t13 : Voyages\n 6 : Politique\t\t\t14 : Culture\n 7 : Economie\t\t\t15 : Societe\n ALL:* \n\n Votre choix : "; # Récupération de l'identifiant de la rubrique tapé par l'utilisateur $id = ; # Suppression du dernier caractère de retour à la ligne s'il y en a un chomp($id); #Choix de la rubrique ou de toutes les rubriques if ($id eq 0) {$num="3208";;$rubrique="a_la_une";} #lê-se se $id equivale a 0 elsif ($id eq 1) {$num="3210";$rubrique="international";} elsif ($id eq 2) {$num="3214";$rubrique="europe";} elsif ($id eq 3) {$num="3260";$rubrique="livres";} elsif ($id eq 4) {$num="3476";$rubrique="cinema";} elsif ($id eq 5) {$num="651865";$rubrique="technologie";} elsif ($id eq 6) {$num="823353";$rubrique="politique";} elsif ($id eq 7) {$num="3234";$rubrique="economie";} elsif ($id eq 8) {$num="3236";$rubrique="medias";} elsif ($id eq 9) {$num="3238";$rubrique="rendez-vous";} elsif ($id eq 10) {$num="3242";$rubrique="sport";} elsif ($id eq 11) {$num="3232";$rubrique="opinions";} elsif ($id eq 12) {$num="32344";$rubrique="planete";} elsif ($id eq 13) {$num="3246";$rubrique="voyages";} elsif ($id eq 14) {$num="3546";$rubrique="culture";} elsif ($id eq 15) {$num="3224";$rubrique="societe";} elsif ($id eq "*") {$num="ALL";$rubrique="toutes_les_rubriques";} else { print "Je n'ai pas compris, veuillez indiquer la rubrique à traiter\n"; } #----------------------------- # stockage des chemins et noms des différentes sorties #création d'un dossier pour les sorties my $folder="SORTIES_REGEX_".$rubrique; @args = ("mkdir", "$folder"); system(@args) == 0 or die "system @args failed: $?"; my $output1_xml=$folder."/SORTIE_".$rubrique.".xml"; my $output2_txt=$folder."/SORTIE_".$rubrique.".txt"; my $outputtmp=$folder."/SORTIE_txtbaliseTreeTagger_".$rubrique.".txt"; ###SORTIES_REGEX_".$rubrique."/ # ouverture des fichiers de sortie my $encodagesortie="utf-8"; if (!open(OUTXML,">:encoding($encodagesortie)",$output1_xml)) { die "Pb a l'ouverture du fichier $output1_xml.xml"}; if (!open(OUTTXT,">:encoding($encodagesortie)",$output2_txt)) { die "Pb a l'ouverture du fichier $output2_txt.txt"}; if (!open (TMP,">:encoding(iso-8859-1)",$outputtmp)) { die "Pb a l'ouverture du fichier $outputtmp"}; #---------------------------------------- &parcoursarborescencefichiers($rep); #recurse! procédure qui parcourt l'arborescence du fichier. début du parcour d'arborescence du fichier #---------------------------------------- # Creation du fichier XML:les premières lignes de mon fichier print OUTXML "\n"; print OUTXML "\n"; print OUTXML "Sadoune & Martins & Faiz\n"; print OUTXML "\n".$DUMPXML."\n"; print OUTXML "\n"; close(OUTXML); # Creation du fichier TXT print OUTTXT "$DUMPTXT"; close (OUTTXT); # création de la sortie temporaire pour TreeTagger print TMP "<$rubrique>\n\n"; print TMP "$DUMPTMP"; close(TMP); #On lance la procédure d'étiquetage treetagger &lancetreetagger; ## Fin du programme exit; ## Et on définit les procédures ### #---------------------------------------------- # Procédure parcoursarborescencefichiers sub parcoursarborescencefichiers { #recupération du nom de paramètre passee en procedure my $path = shift(@_); #argument passé en procedure, dans la variable $path, on a pour valeur, la valeur 2008 opendir(DIR, $path) or die "can't open $path: $!\n"; # on ouvre le répertoire par la commande opendir(pointeur de répertoire (mot clé pour faire référence au dossier physique caché derrière la variable) et nom de la variable. fonction die permet d'interrompre l'execution d'un programme et envoie à l'ecran le message d'erreur (idem que or exit) my @files = readdir(DIR); #commande readdir lit le contenu d'un répertoire et prend comme argument un pointeur de répertoire. la commande readdir renvoie comme valeur une liste des éléments constitutifs du répertoire (dossiers) fonction readdir renvoie aux fichiers, répertoire courant et répertoire parent closedir(DIR); foreach my $file (@files) { #parcourt une liste @files, prend chacun des éléments constitutifs du répertoire. on applique des traitements différents en fonction des objectifs next if $file =~ /^\.\.?$/; # my $nomdefichier=$file; $file = $path."/".$file; #$file (fichier jan) la ressource est elle un répertoire ou un fichier? if (-d $file) { #pour savoir si ressource issue de la liste des fichiers de telle année est un répertoire. # -d $file sera vrai si é um rep e falso se é um fichier &parcoursarborescencefichiers($file); #recurse! mis en oeuvre d'un mecanisme de récursivité jusqu'à epuisement; #ex 2008/jan, si répertoire la procedure est relancer ex 2008/jan/1, #quand on arrive sur des fichiers, arrêt de la récursivité } if ((-f $file) && ($file=~/.xml$/) && ($nomdefichier!~/^fil/)) { my $file2traite=""; # on initie une variable a vide if ($num eq "ALL") { #traitement de tous le fichiers $file2traite=$file; } else { if ($file=~/0,2-$num,1-0,0\.xml$/) {#traitement d'une rubrique en particulier $file2traite=$file; } } if ($file2traite ne "") { #print "contenu de $file : \n"; #lecture de $file open(FILE, $file); my $firstline=; $firstline=~/encoding=['"]([^'"]+)['"]/; my $encodage=$1; close(FILE); open(FILE,"<:encoding($encodage)", $file); my $texte=""; # $texte, jinicialize vide, while (my $ligne=) { # # je lis le flux integrelement, #print $ligne; $ligne =~ s/\n//g; # chaq fois q je la lis,jenleve le retour à linge et jeconcatee $texte .= $ligne; #ici jconcatene la ligne q jviens d lire #if ($ligne=~/(.+)<\/title>/) { #print "TITRE : $1 \n"; Ces 2 lignes étaient avant } $texte =~ s/> *</></g; # suprimer tt c qy a comme blanc entre les chevrons fermants et chevrons ouvrants et jremplace par >< $texte=~/<pubDate>([^<]+)<\/pubDate>/; # jcherche la balise pubdate et jmemorize le contenu d cette balise dns $date my $date=$1; print $date,"\n"; if (uc($encodage) ne "UTF-8") {utf8($date);} # si cest pa dutf8,faut q jtransforme(uc=majuscule) $DUMPXML.="<date>".$date."</date>\n"; # jmets la date dans des balises dates $DUMPXML.="<items>\n"; # texte de balises items # extraction de contenu txtuel, utilisant regex. (.+?)=qq ch. .+?=qq ch. /g tant q tu peux trouver ce modele dans la ligne,tu le fais while ($texte =~ /<item><title>([^<]+)<\/title>.+?<description>([^<]+)<\/description>/gi) { my $titre=$1; # contenu txtuelle de title my $resume=$2; # contenu txtuelle de resume if (uc($encodage) ne "UTF-8") {utf8($titre);utf8($resume);} $titre = &nettoietexte($titre); # suprimer du contenu txtuelle les scories q peuvent apparaitre,resultat renvoyé à $titre $resume = &nettoietexte($resume); if (!(exists($dictionnairedesrubriques{$resume}))) { $DUMPTXT.="Titre : $titre \n"; $DUMPTXT.="Resume : $resume \n";; $DUMPXML.="<item><title>$titre$resume\n"; $DUMPTMP.=" $titre $resume\n"; $dictionnairedesrubriques{$resume}++; } else { $dictionnairedesrubriques{$resume}++; } } $DUMPXML.="\n\n"; close(FILE); } } } } #---------------------------------------------- sub nettoietexte { my $texte=shift; #prend une entrée un parametre et revoie une valeur de la chaine de caracteres nettoyé.fonction shift je vide le tableau des arguments passé à la procédure $texte =~ s/<//g; $texte =~ s/]+>//g; $texte =~ s/]+>//g; $texte =~ s/<\/a>//g; $texte =~ s/&#39;/'/g; $texte =~ s/&#34;/"/g; $texte =~ s/<[^>]+>//g; $texte =~s/'/\'/g; $texte =~s/"/\"/g; $texte =~s/é/é/g; $texte =~s/ê/ê/g; $texte =~s/&eacute;/é/g; $texte =~s/&egrave;/è/g; $texte =~s/&icirc;/\î/g; $texte =~s/&ocirc;/\ô/g; $texte =~s/&ccedil;/\ç/g; $texte =~s/&agrave;/\à/g; $texte =~s/&/&/g; $texte =~s/<.*$//g; $texte =~ s/&|&/&/g; $texte =~ s/&|&/&/g; $texte =~ s/'|'/'/g; $texte =~ s/ | /? /g; $texte =~ s/­|­/­/g; $texte =~ s/"|"/"/g; $texte =~ s/«|«/«/g; $texte =~ s/»|»/»/g; $texte =~ s/‹|‹/‹/g; $texte =~ s/›|›/›/g; $texte =~ s/“|“/“/g; $texte =~ s/”|”/”/g; $texte =~ s/„|„/„/g; $texte =~ s/‘|‘/‘/g; $texte =~ s/„|„/„/g; $texte =~ s/’|’/’/g; $texte =~ s/‚|‚/‚/g; $texte =~ s/…|…/…/g; $texte =~ s/!|!/!/g; $texte =~ s/¡|¡/¡/g; $texte =~ s/\?|?/\?/g; $texte =~ s/\(|(/\(/g; $texte =~ s/\)|)/\)/g; $texte =~ s/\[|[/\[/g; $texte =~ s/]|]/]/g; $texte =~ s/{|{/{/g; $texte =~ s/}|}/}/g; $texte =~ s/¨|¨/¨/g; $texte =~ s/´|´/´/g; $texte =~ s/`|`/`/g; $texte =~ s/\^|^/\^/g; $texte =~ s/ˆ|ˆ/ˆ/g; $texte =~ s/~|~/~/g; $texte =~ s/#|#/#/g; $texte =~ s/\*|*/\*/g; $texte =~ s/,|,/,/g; $texte =~ s/\.|./\./g; $texte =~ s/:|:/:/g; $texte =~ s/;|;/;/g; $texte =~ s/·|·/·/g; $texte =~ s/•|•/•/g; $texte =~ s/¯|¯/¯/g; $texte =~ s/-|-/-/g; $texte =~ s/–|–/–/g; $texte =~ s/—|—/—/g; $texte =~ s/_|_/_/g; $texte =~ s/\|||/\|/g; $texte =~ s/¦|¦/¦/g; $texte =~ s/‍|‍/?/g; $texte =~ s/†|†/†/g; $texte =~ s/‡|‡/‡/g; $texte =~ s/‡|‡/‡/g; $texte =~ s/§|§/§/g; $texte =~ s/¶|¶/¶/g; $texte =~ s/©|©/©/g; $texte =~ s/®|®/®/g; $texte =~ s/™|™/™/g; $texte =~ s/@|@/@/g; $texte =~ s/\/|//\//g; $texte =~ s/\\|\/\\/g; $texte =~ s/◊|◊/?/g; $texte =~ s/♠|♠/?/g; $texte =~ s/♣|♣/?/g; $texte =~ s/♥|♥/?/g; $texte =~ s/♦|♦/?/g; $texte =~ s/←|←/?/g; $texte =~ s/↑|↑/?/g; $texte =~ s/→|→/?/g; $texte =~ s/↓|↓/?/g; $texte =~ s/↔|↔/?/g; $texte =~ s/á|á/á/g; $texte =~ s/Á|Á/Á/g; $texte =~ s/â|â/â/g; $texte =~ s/Â|Â/Â/g; $texte =~ s/à|à/à/g; $texte =~ s/À|À/À/g; $texte =~ s/å|å/å/g; $texte =~ s/Å|Å/Å/g; $texte =~ s/ã|ã/ã/g; $texte =~ s/Ã|Ã/Ã/g; $texte =~ s/ä|ä/ä/g; $texte =~ s/Ä|Ä/Ä/g; $texte =~ s/æ|æ/æ/g; $texte =~ s/Æ|Æ/Æ/g; $texte =~ s/ç|ç/ç/g; $texte =~ s/Ç|Ç/Ç/g; $texte =~ s/é|é/é/g; $texte =~ s/É|É/É/g; $texte =~ s/ê|ê/ê/g; $texte =~ s/Ê|Ê/Ê/g; $texte =~ s/è|è/è/g; $texte =~ s/È|È/È/g; $texte =~ s/ë|ë/ë/g; $texte =~ s/Ë|Ë/Ë/g; $texte =~ s/í|í/í/g; $texte =~ s/Í|Í/Í/g; $texte =~ s/î|î/î/g; $texte =~ s/Î|Î/Î/g; $texte =~ s/ì|ì/ì/g; $texte =~ s/Ì|Ì/Ì/g; $texte =~ s/ï|ï/ï/g; $texte =~ s/Ï|Ï/Ï/g; $texte =~ s/ñ|ñ/ñ/g; $texte =~ s/Ñ|Ñ/Ñ/g; $texte =~ s/ó|ó/ó/g; $texte =~ s/Ó|Ó/Ó/g; $texte =~ s/ô|ô/ô/g; $texte =~ s/Ô|Ô/Ô/g; $texte =~ s/ò|ò/ò/g; $texte =~ s/Ò|Ò/Ò/g; $texte =~ s/ø|ø/ø/g; $texte =~ s/Ø|Ø/Ø/g; $texte =~ s/õ|õ/õ/g; $texte =~ s/Õ|Õ/Õ/g; $texte =~ s/ö|ö/ö/g; $texte =~ s/Ö|Ö/Ö/g; $texte =~ s/œ|œ/œ/g; $texte =~ s/Œ|Œ/Œ/g; $texte =~ s/š|š/š/g; $texte =~ s/Š|Š/Š/g; $texte =~ s/ß|ß/ß/g; $texte =~ s/ð|ð/ð/g; $texte =~ s/Ð|Ð/Ð/g; $texte =~ s/þ|þ/þ/g; $texte =~ s/Þ|Þ/Þ/g; $texte =~ s/ú|ú/ú/g; $texte =~ s/Ú|Ú/Ú/g; $texte =~ s/û|û/û/g; $texte =~ s/Û|Û/Û/g; $texte =~ s/ù|ù/ù/g; $texte =~ s/Ù|Ù/Ù/g; $texte =~ s/ü|ü/ü/g; $texte =~ s/Ü|Ü/Ü/g; $texte =~ s/ý|ý/ý/g; $texte =~ s/Ý|Ý/Ý/g; $texte =~ s/ÿ|ÿ/ÿ/g; $texte =~ s/Ÿ|Ÿ/Ÿ/g; $texte =~ s/¤|¤/¤/g; $texte =~ s/€|€/€/g; $texte =~ s/\$|$/\$/g; $texte =~ s/¢|¢/¢/g; $texte =~ s/£|£/£/g; $texte =~ s/¥|¥/¥/g; $texte =~ s/ƒ|ƒ/ƒ/g; $texte =~ s/α|α/a/g; $texte =~ s/Α|Α/?/g; $texte =~ s/β|β/ß/g; $texte =~ s/Β|Β/?/g; $texte =~ s/γ|γ/?/g; $texte =~ s/Γ|Γ/G/g; $texte =~ s/δ|δ/d/g; $texte =~ s/Δ|Δ/?/g; $texte =~ s/ε|ε/e/g; $texte =~ s/Ε|Ε/?/g; $texte =~ s/ζ|ζ/?/g; $texte =~ s/Ζ|Ζ/?/g; $texte =~ s/η|η/?/g; $texte =~ s/Η|Η/?/g; $texte =~ s/θ|θ/?/g; $texte =~ s/Θ|Θ/T/g; $texte =~ s/ι|ι/?/g; $texte =~ s/Ι|Ι/?/g; $texte =~ s/κ|κ/?/g; $texte =~ s/Κ|Κ/?/g; $texte =~ s/λ|λ/?/g; $texte =~ s/Λ|Λ/?/g; $texte =~ s/μ|μ/µ/g; $texte =~ s/Μ|Μ/?/g; $texte =~ s/ν|ν/?/g; $texte =~ s/Ν|Ν/?/g; $texte =~ s/ξ|ξ/?/g; $texte =~ s/Ξ|Ξ/?/g; $texte =~ s/ο|ο/?/g; $texte =~ s/Ο|Ο/?/g; $texte =~ s/π|π/p/g; $texte =~ s/Π|Π/?/g; $texte =~ s/ρ|ρ/?/g; $texte =~ s/Ρ|Ρ/?/g; $texte =~ s/σ|σ/s/g; $texte =~ s/ς|ς/?/g; $texte =~ s/Σ|Σ/S/g; $texte =~ s/τ|τ/t/g; $texte =~ s/Τ|Τ/?/g; $texte =~ s/υ|υ/?/g; $texte =~ s/Υ|Υ/?/g; $texte =~ s/φ|φ/f/g; $texte =~ s/Φ|Φ/F/g; $texte =~ s/χ|χ/?/g; $texte =~ s/Χ|Χ/?/g; $texte =~ s/ψ|ψ/?/g; $texte =~ s/Ψ|Ψ/?/g; $texte =~ s/ω|ω/?/g; $texte =~ s/Ω|Ω/O/g; $texte =~ s/°|°/°/g; $texte =~ s/µ|µ/µ/g; $texte =~ s/<|<//g; $texte =~ s/≤|≤/=/g; $texte =~ s/≥|≥/=/g; $texte =~ s/=|=/=/g; $texte =~ s/≈|≈/˜/g; $texte =~ s/≠|≠/?/g; $texte =~ s/≡|≡/=/g; $texte =~ s/±|±/±/g; $texte =~ s/−|−/-/g; $texte =~ s/\+|+/\+/g; $texte =~ s/×|×/×/g; $texte =~ s/÷|÷/÷/g; $texte =~ s/⁄|⁄//g; $texte =~ s/%|%/%/g; $texte =~ s/‰|‰/‰/g; $texte =~ s/¼|¼/¼/g; $texte =~ s/½|¼/½/g; $texte =~ s/¾|¼/¾/g; $texte =~ s/¹|¹/¹/g; $texte =~ s/²|²/²/g; $texte =~ s/³|³/³/g; $texte =~ s/º|º/º/g; $texte =~ s/ª|ª/ª/g; $texte =~ s/ƒ|ƒ/ƒ/g; $texte =~ s/′|′/'/g; $texte =~ s/″|″/?/g; $texte =~ s/∂|∂/?/g; $texte =~ s/∏|∏/?/g; $texte =~ s/∑|∑/?/g; $texte =~ s/√|√/v/g; $texte =~ s/∞|∞/8/g; $texte =~ s/¬|¬/¬/g; $texte =~ s/∩|∩/n/g; $texte =~ s/∫|∫/?/g; $texte =~ s/<.+?>//g; return $texte; } # Procédure d'étiquetage Treetagger sub lancetreetagger { system("perl TreeTagger/tokenise-fr.pl $outputtmp | tree-tagger.exe TreeTagger/french.par -lemma -token -no-unknown -sgml > $folder./treetagger_$rubrique"); system("perl treetagger2xml.pl $folder./treetagger_$rubrique"); }