Boîte à outils 1

Cette boîte à outils a pour objectif d'extraire des données textuelles de fichiers XML contenus dans un dossier qu'on indique en argument de la commande.

Ce premier script, écrit en Perl pur, récupère le titre et la description de l'article : c'est l'extraction de surface.

#/usr/bin/perl

my $rep="$ARGV[0]";
my $rubrique = "$ARGV[1]";
my %dico;

# On s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;

# Variable contenant le flux de sortie
my $output1="$rubrique.xml";

# Ouverture du fichier de sortie
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 "\t<nom>Zakarya</nom>\n";
close (FILEOUT);

#Lancement de la récursion, qui se terminera après examen de toute l'arborescence.
&parcoursarborescencefichiers($rep);

open (FILEOUT,">>:encoding(utf-8)", $output1); 
print FILEOUT "\n"; 
close(FILEOUT); 
exit;

sub parcoursarborescencefichiers
{
    my $path = shift(@_) ;
    opendir(DIR, $path) or die "can't open $path: $!\n";
    my @files = readdir(DIR); 
    closedir(DIR);

    foreach my $file (@files)
    {
        next if $file =~ /^\.\.?$/;
        $file = $path."/".$file; #2016/01/19,00,00 
        if (-d $file)
        {
            print " début répertoire ==> $file\n";
            &parcoursarborescencefichiers($file);
            print " fin répertoire ==> $file\n"; 
        }
        if (-f $file) 
        {
            if ($file =~ /$rubrique.+\.xml$/) 
            {
                print "<",$i++,"> ==> ",$file,"\n";
                #traitement pour extraire texte
                $codage = "utf-8";
                open (FIC, "<:encoding($codage)", $file);
                open (TEXT, "<<:encoding($codage)", "$rubrique.txt");
                open (XML, ">>:encoding($codage)", "$rubrique.xml"); 
                #ramener tout le flux textuel de FIC sur une seule ligne
                my $texte="";
                while (my $ligne = <FIC>)
                {
                    chomp $ligne;
                    $ligne =~ s/\r//g;
                    $texte = $texte . $ligne;
                }
                close FIC;

                # Extraction du contenu des balises
                while($texte =~ m/>\s+<title>([^<]+?)<\/title><link>(?:[^<]+?)<\/link><description>([^<]+?)<\/description>/) 
                {
                    my $titre = $1;
                    my $description = $2;

                    # Mise en forme des titres
                    $titre.=".";
                    $titre=~s/\?\.$/\?/;

                    # L'impression ne se déroule que si le titre est unique
                    if (!(exists $dico{$titre}))
                    {
                        $dico{$titre} = 1;

                        print TEXT "Titre : $titre\n";
                        print TEXT "Description : $description\n\n";

                        print XML "<item>\n" ;
                        print XML "<title>$titre</title>\n" ;
                        print XML "<description>$description</description>\n";
                        print XML "</item>\n"
                    }
                }
            } 
        }
        close TEXT;
        close XML;
    }
}

On obtient alors un fichier texte qui ressemble à ça :

Titre : Affluence à la parade de Thanksgiving de New York.
Description : En dépit des mesures de sécurité renforcées après les attentats de Paris, des milliers de personnes ont assisté à New York à la traditionnelle parade de Thanksgiving.

Titre : La Russie ne coupera pas le gaz à la Turquie.
Description : Moscou et Ankara cherchent à épargner leur coopération énergétique, en dépit de la destruction, mardi, d’un avion russe par deux chasseurs turcs.

Et un fichier XML qui ressemble à ça :

<parcours>
	<nom>Zakarya</nom>
	<item>
		<titre>Affluence à la parade de Thanksgiving de New York.</titre>
		<description>En dépit des mesures de sécurité renforcées après les attentats de Paris, des milliers de personnes ont assisté à New York à la traditionnelle parade de Thanksgiving.</description>
	</item>
	<item>
		<titre>La Russie ne coupera pas le gaz à la Turquie.
		<description>Moscou et Ankara cherchent à épargner leur coopération énergétique, en dépit de la destruction, mardi, d’un avion russe par deux chasseurs turcs.
	</item>
</parcours>