Suppression des doublons dans un tableau des chaines

Fermé
rimenis Messages postés 3 Date d'inscription samedi 1 décembre 2012 Statut Membre Dernière intervention 22 février 2013 - 22 févr. 2013 à 12:13
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 25 févr. 2013 à 13:36
Bonjour,
J'ai un fichier dont chaque ligne contient un mot, j'ai récupéré le contenu de ce fichier dans un tableau et j'ai essayé de supprimer les doublons , j'ai essayé ce code mais toujours il y a des problèmes
voilà le code :

open(F,'E:\\Script\\IN.txt') or die ("Erreur d'ouverture ") ;
#open(FIC,'>E:\\Mastère_2013\\Script\\OUT.txt') or die ("Erreur de creation ") ;



 @Ti = <F>;



my %dejavu;
chomp(@Ti);
foreach my $elem ( @Ti )
{
     $dejavu{$elem} = 1;
}

print $_, "\n" foreach keys %dejavu


Mon fichier d'entré contient les lignes suivants:
bonjour
bonsoir
bonsoir
madame
bonjour
madame

voici la sortie de mon programme :

madame
bonsoir
bonjour
bonjour
Le problème est qu'il ya ajout des caractères dans les 2 bonjour de telle façons ils n'apparaissent pas identiques...
D'ou vient ce problème??
Merci de me répondre


A voir également:

2 réponses

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 22/02/2013 à 13:13
Salut rimenis,

Ton fichier de données doit contenir des données en utf8 mal encodées.

Les fichiers textes (correctement) encodés en utf8 peuvent contenir un BOM, qui indique l'utilisation d'un encodage unicode : https://fr.wikipedia.org/wiki/Byte_Order_Mark#UTF-8. Ce marquage est au début du fichier. Il est facultatif.

Bien que Perl manipule nativement des chaînes en utf8, ton fichier ne semble pas lui plaire, et les 3 caractères que Perl voit à gauche du texte de la 1ère ligne de ton fichier correspondent effectivement à la valeur Unicode de \x{feff} en ASCII.

Tu peux essayer de forcer Perl à considérer le fichier comme encodé en utf8 :

open(F, "<:utf8", "E:\\Script\\IN.txt") or die ("Erreur d'ouverture") ;

et voir si cela change quelque chose.

Sinon, tu peux corriger l'encodage de ton fichier, ou si tu n'utilises que du ISO-88591-1, retirer le BOM. Tu peux faire ces différentes manipulations avec Notepad++ sous Windows (menu "Encodage").


Dal
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
22 févr. 2013 à 14:15
Sinon, en Perl, pour supprimer les doublons et en prime classer ton tableau, c'est plus court comme cela :

my %hash = map { $_ => 1 } @Ti;
@Ti = sort keys %hash;

Dal
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
22 févr. 2013 à 14:17
ou avec List::MoreUtils (cf. CPAN), en une ligne :

@Ti = uniq sort @Ti;

Dal
0
rimenis Messages postés 3 Date d'inscription samedi 1 décembre 2012 Statut Membre Dernière intervention 22 février 2013
22 févr. 2013 à 19:26
Bonsoir ,
J'ai reussi à resoudre le problème d'encodage en utilisant ce code :

open(F,'E:\\Script\\IN6.txt') or die ("Erreur d'ouverture ") ;

open(FIC,'>E:\\Script\\OUT.txt') or die ("Erreur de creation ") ;

@Ti = <F>;
close F;
my $line = shift @Ti; 
$line =~ s/^\x{ef}\x{bb}\x{bf}//; #retire la BOM UTF-8 de début de fichier 
unshift @Ti, $line; 
map {chomp; s/(^\s*|\s*$)//g} @Ti; 

my %dejavu;


foreach my $elem ( @Ti )
{
     $dejavu{$elem} = 1;
}
#print $_ , "\n" foreach keys %dejavu

print FIC $_ , "\n" foreach keys %dejavu
	


Mais avec cette solution j'ai perdu l'ordre des mots .... Avez vous une solution??
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 25/02/2013 à 13:24
Salut,

Que veux tu dire par "perdu l'ordre des mots".

Dans l'exemple de ton post d'origine tu faisais :

Mon fichier d'entré contient les lignes suivants:
bonjour
bonsoir
bonsoir
madame
bonjour
madame

voici la sortie de mon programme :

madame
bonsoir
(...)


Tu veux dire que ce n'est pas, en fin de compte, ce que tu veux, et que tu veux avoir :

bonjour
bonsoir
madame


?


Dal
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 25/02/2013 à 13:38
Si c'est cela, tu peux faire comme ceci :

open(F,'E:\\Script\\IN6.txt') or die ("Erreur d'ouverture ") ; 
open(FIC,'>E:\\Script\\OUT.txt') or die ("Erreur de creation ") ; 

my %dejavu; 

while(<F>) { 
  s/^\x{ef}\x{bb}\x{bf}//; 
  print FIC $_ unless $dejavu{$_}++; 
} 
close F; 
close FIC;

(j'ai retiré le chomp, car tu remets un \n dans le fichier de sortie).


Dal
0