Perl doublon fichier
falco-
Messages postés
1
Date d'inscription
Statut
Membre
Dernière intervention
-
lami20j Messages postés 21331 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
lami20j Messages postés 21331 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
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.
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:
- Perl doublon fichier
- Fichier bin - Guide
- Fichier epub - Guide
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier .dat - Guide
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...
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...
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__
#!/usr/bin/perl
use strict;use warnings;
my %h;
open LIRE,"unique.txt" or die "E/S : $!\n";
print "$_" for grep { ! $h{$_}++ } <LIRE>;
__END__
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