#!/usr/bin/perl

#########################################
# DESCRIPTION DU PROGRAMME
# Construit un dictionnaire alphabétique et un dictionnaire par occurrences à partir d'un fichier texte passé en paramètre
#########################################

#########################################
# PROCEDURE
#########################################
sub nettoyage {
    my ($ligne) = shift(@_);
    $ligne =~s/^ +//g;							# nettoyage du texte : suppression des blancs de début de ligne
    $ligne =~s/ +$//g;							# ...de fin de ligne 
    $ligne=~s/(\.|,|;|:|\?|!|\(|\))//g;			# suppression des ponctuations
    $ligne =~s/( +|\t+)/ /g;					# remplacement des doubles (ou plus) espaces par des espaces simples
    $ligne =~s/\n/ /g;							# supprime les lignes vides introduites par le  nettoyage
    chomp($ligne);
    return $ligne;
}
#########################################

open (FILE, $ARGV[0]) or die "Impossible d'ouvrir $ARGV[0]";
open (FILEOUT1, ">$ARGV[0]-dicodoccurrences.txt");
open (FILEOUT2, ">$ARGV[0]-dicoalphabetique.txt");

my %occ;									# création de la table de hachage qui va contenir les couples mot/nbr d'occurrences
my $cptline = 0;							# création des compteurs de lignes et de mots
my $cptmot = 0;

while ($ligne = <FILE>) {
	$ligne = &nettoyage($ligne);
	if ($ligne!~/^[ ]*$/) {					# test : si pas ligne vide
	    @mots = split (/ /, $ligne);		# segmentation en mots
	    foreach $mot (@mots){				# parcours de la liste de mots (chaque item de @mots assigné comme valeur de $mot)
			$occ {lc ($mot) }++;			# incrémentation si clef déjà présente, sinon ajout du mot dans la table ; la fonction LC prend une string et la retourne en minuscules
			$cptmot++;					
	    }
	}
	$cptline++ ;
}
my @listeclefs = keys (%occ);				# on crée un tableau contenant les clefs de la table... 
my $motsdiff = $#listeclefs+1;				# ...pour récupérer sa longueur (=obtenir le nbr de mots différents)

print "\nAnalyse du fichier $ARGV[0] :\n";
print "\n\t$cptline ligne(s), $cptmot mot(s) dont $motsdiff mot(s) différent(s)\n";
print "\nVous pouvez consulter les dictionnaires générés, $ARGV[0]-dicoalphabetique.txt et $ARGV[0]-dicodoccurrences.txt, dont voici le début :\n";
print "\nFichier $ARGV[0]-dicoalphabetique.txt :\n";

@dicalpha = sort keys %occ;					# on met dans @dicalpha le tri alphabétique (tri par défaut de la fonction SORT) des clefs de la table %occ (cad des mots)
foreach my $mot (@dicalpha){
	print FILEOUT2 "$mot\t$occ{$mot}\n";
    }
$i=1;
until ($i==10){ 
    $mot=$dicalpha[$i-1];
    print "$mot\t$occ{$mot}\n";				# affichage à l'écran des 10 premières lignes de dicalpha
    $i++;
}

print "\nFichier $ARGV[0]-dicodoccurrences.txt :\n";

@dicocc = sort { $occ{$b} <=> $occ{$a} } keys %occ;		# idem mais tri numérique (avec comparaison des valeurs)
foreach my $mot (@dicocc){
	print FILEOUT1 "$mot\t$occ{$mot}\n"; 
}
$i=1;
until ($i==10){ 
    $mot=$dicocc[$i-1];
    print "$mot\t$occ{$mot}\n";				# affichage à l'écran des 10 premières lignes de dicocc
    $i++;
}

close (FILE);
close (FILEOUT1);
close (FILEOUT2);
