BàO 1


Boite à outils 1 : Filtrage et Nettoyage


Il faut construire un programme en perl qui est capable de faire les actions suivant:


  § parcourir une arborescence de fichiers;


  § filtrer les contenus textuels des balises DESCRIPTION et TITLE contenues dans les balises ITEM;


  § nettoyer le corpus et le sauvgarder en forme .txt et .xml.


Script:


Cette partie de programme barse ensemble des répretoires et cherche tous les fichiers en forme XML en respectant le nom de repertoire que nous lui avons donné.


      


#---------------------------------------------------------------
#Etape 1: je veux recuperer tous les fichier dans le repertoire 
#---------------------------------------------------------------
my $repertoire = "$ARGV[0]"; #l'adresse de repertoire
%dico; #hash
#cree les fichiers pour stoker le texte
open (OUTPUT, ">:encoding(utf8)", "output1.txt") or die "NE PEUT PAS OUVIRE LE FICHIER !";
open (OUTPUT1, ">:encoding(utf8)", "output1.xml") or die "NE PEUT PAS OUVIRE LE FICHIER !";

print OUTPUT1 "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print OUTPUT1 "<PARCOURS>\n";
print OUTPUT1 "<NOM>Yuran ZHAO et Mingqiang WANG</NOM>\n";
#print OUTPUT "<FILTRAGE>".$DUMPFULL1."</FILTRAGE>\n";
print OUTPUT1 "</PARCOURS>\n";

&parcours($repertoire); #appeller la fonction qui recupeter tous les fichies qu'on a besoin dans un repertoire arborescence et les traiter

close OUTPUT;
close OUTPUT1;

sub parcours
{
  my $path = shift(@_); #shift ==> retourne le premier element d'une liste
                        # @_ ===> une liste
  #je veux ouvrir la liste de mon repertoire
  opendir(DIR, $path) or die "NE PEUT PAS OUVIRE LE REPERTOIRE !";
  #je veux le lire
  my @file = readdir(DIR);
  closedir(DIR);
  foreach my $file (@file)
  {
    my @fichier = (@_);
    next if $file =~ /^\.\.?$/; #j'ignore le cas : nom de fichier est . ou ..
                                # avec "=~" on peut lire un variable qui contient une expression reguliere
    $file = $path."/".$file;
    $fichier = $file;
    if (-d $file) #-d ==> test si $file a un repertoire (qui a une liste)
    {
      print " ========> ",$file,"\n";
      &parcours($file); #recurse!
      print " =========> ",$file,"\n";      
    }


        


La partie suivante consiste à traiter les informations recueillies

      

    #----------------------------------------------------------------------------------
    #Etape 2: je veux traiter tous les fichiers que on a trouvé : filtrage et nettoyager
    #----------------------------------------------------------------------------------
    if (-f $file)  #-f ==>verifier si $file est un fichier normal
    {
      #je veux travaille sur uniquement les fichier xml 
      if ($file =~ /$rubrique.+\.xml/)
      {
        #je ouvert ce fichier
        print "$file\n";
        open (INPUT, "<:encoding(utf8)", $file);
        #je cree un variable vide pour stoker le contenu
        open (OUTPUT, ">>:encoding(utf8)", "$rubrique.txt") or die "NE PEUT PAS OUVIRE LE FICHIER !";
        open (OUTPUT1, ">>:encoding(utf8)", "$rubrique.xml") or die "NE PEUT PAS OUVIRE LE FICHIER !";
        my $texte = "";
        while (my $ligne =<INPUT>) #filtrage
        {
          chomp $ligne; #supprime le retour de ligne
          $ligne =~s/\r//g; #enleve tous les "\r" 
          $texte = $texte.$ligne;

        }#while
        close INPUT;
        #je ne veux pas l'espace entre les chevrons
        $texte =~ s/< +</<</g;
        $description =~ s/<.+?>//g;
        $title =~ s/&//g;
        $description =~ s/xE[0-9]//g;
        #sortir-la-partie-"title"-et-"description"        
        while ($texte =~ m/<item<<link<(?:[^<]+?)<\/link<<title<([^<]+?)<\/title<<description<([^<]+?)<\/description</g)
        {
          my $title = $2;
          my $description = $3;
          #-----------------------------------------------------------------------------------
          # nettoyage
          #-----------------------------------------------------------------------------------
          $description =~ s/<.+?>//g;
          $title =~ s/&//g;
          $description =~ s/xE[0-9]//g;
          #------------------------------------------------------------------------------------
          if (!(exists $dico{$title})) 
          {
            #my ($xmltitle,$xmldescription) = &etiquette($title,$description); #appelle fonction etiquette
            $dico{$title} = 1; #la valeur correspondant à la clef $titre est 1
            print OUTPUT "$file\n";        
            print OUTPUT "$title\n"; 
            print OUTPUT "$description\n";
            print OUTPUT1 "<name> $file <\/name>\n";
            print OUTPUT1 "<item><title>$title<\/title><description>$description<\/description><\/itme>";      
          }#if
        }#while
        close OUTPUT;
        close OUTPUT1;
      }#if
    }#if

      
      



Pour voir le script complet, cliquez sur le lien suivant


Fichier sortie