Perl doublon fichier

Fermé
falco- Messages postés 1 Date d'inscription jeudi 28 juin 2007 Statut Membre Dernière intervention 28 juin 2007 - 28 juin 2007 à 11:09
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 7 mai 2008 à 11:39
Bonjour,
dans un fichier du type :
aaa
bbbbb
ccccc
aa
aaaa

il s'agit d'enlever les doublons.
Il faudrait à priori (?) passer par une table de hachage.
J'ai essayé :
open(FILE,"$path/toto");
while(<FILE>)
{
push @TdT, [ split('\n', $_) ];
}
my %hachage = @TdT;
my @uniques = keys %hachage;


# affiche le tableau de hachage hachage
foreach my $k (@uniques)
{
print "Clef=$k Valeur=$hachage{$k}\n";
print "Valeurxx=$TdT[$hachage{$k}]\n";

}

# ---> ne donne pas les valeurs



foreach my $t (@TdT)
{ next if $deja_vu{$t}++;
push(@uniques,$t);
}
# --> ceci ne marche pas non plus !
# affiche le tableau uniques
for $aref ( @uniques ) {
print "@$aref\n";
}
# j'obtiens les mêmes données que fichier toto avec les doublons !


et !!!!
for $i ( 0 .. $#TdT ) {
$objet = $TdT[$i][0];
print "elt $i is $objet \n";
print DOUBLONS @uniques ;
print DOUBLONS "\n" ;
}

#--> ne marche pas non plus !


Je pense qu'il y a plus simple !

Merci pour vos lumières.
A voir également:

2 réponses

Le plus simple,
open(FILE,"$path/toto");
my @uniques;
foreach my $ligne (<FILE>) {
my $flag = 1;
foreach my $valeur (@uniques) {
if ($valeur eq $ligne) {
$flag = 0;
}
}
if ($flag) {
push (@uniques,$ligne);
}
}
close FILE;
Et tu obtiens le tableau @uniques qui contient les lignes sans doublons...
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
7 mai 2008 à 10:56
Salut,

le plus simple?! pourquoi?
voici une autre solution ;-)

root@debian:~# cat unique.pl
#!/usr/bin/perl
use strict;use warnings;

my (@unique, %h);
open LIRE,"unique.txt" or die "E/S : $!\n";

print "$_" for @unique = grep { ! $h{$_}++ } <LIRE>;
__END__
root@debian:~# cat unique.txt
aaa
aaa
bbbbb
bbbbb
ccccc
ccccc
aa
aa
aaaa
aaaa
root@debian:~# perl unique.pl
aaa
bbbbb
ccccc
aa
aaaa
0
Qui est encore simplifiable :p

#!/usr/bin/perl
use strict;use warnings;

my %h;
open LIRE,"unique.txt" or die "E/S : $!\n";

print "$_" for grep { ! $h{$_}++ } <LIRE>;
__END__
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
7 mai 2008 à 11:39
d'accord ;-)

root@debian:~# cat unique.pl
#!/usr/bin/perl
use strict;use warnings;

my %h;
print for grep { ! $h{$_}++ } <>;
__END__
root@debian:~# perl unique.pl unique.txt
aaa
bbbbb
ccccc
aa
aaaa
0