Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

eliminer les doublons

3 réponses
Avatar
kurtz_le_pirate
bonjour.

je lis un fichier log ligne par ligne.
pour chaque ligne, je récupère certaines valeurs avec un split.
puis, j'alimente un hash de tableau : push @{$infos{$valeurs[0]}},
$valeurs[10];

tout merche bien sauf que mon tableau $infos{$key} contient des
doublons.
existe-t-il un moyen de les éliminer, ou mieux de ne pas les insérer,
ou bien je dois faire un sub qui analyse chaque tableau pour chaque
clé ?



merci de vos avis
--
klp

3 réponses

Avatar
Paul Gaborit
À (at) Mon, 17 Sep 2007 12:09:41 +0200,
"kurtz_le_pirate" écrivait (wrote):
je lis un fichier log ligne par ligne.
pour chaque ligne, je récupère certaines valeurs avec un split.
puis, j'alimente un hash de tableau : push @{$infos{$valeurs[0]}},
$valeurs[10];

tout merche bien sauf que mon tableau $infos{$key} contient des
doublons.
existe-t-il un moyen de les éliminer, ou mieux de ne pas les insérer,
ou bien je dois faire un sub qui analyse chaque tableau pour chaque
clé ?


Le réflexe lorsqu'on voit apparaître la notion d'unicité (ou la
suppression des doublons), c'est la table de hachage.

À la place de :

# pour stocker
push @{$infos{$valeurs[0]}}, $valeurs[10];
...
# pour récuperer
my $vals = @{$infos{$valeurs[0]}};

On peut faire :

# pour stocker
$infos{$valeurs[0]}{$valeurs[10]}++;
...
# pour récuperer
my $vals = keys %{$infos{$valeurs[0]}};

Comme ça, plus de doublons et au passage on compte le nombre
d'occurence de chaque valeur. Par contre, on perd l'ordre
d'insertion. Si on veut conserver l'ordre, on peut combiner les deux
méthodes ou utiliser un module spécialisé (comme Tie::LLHash par
exemple).

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
kurtz_le_pirate
"Paul Gaborit" a écrit dans le message
de news:
|
| À (at) Mon, 17 Sep 2007 12:09:41 +0200,
| "kurtz_le_pirate" écrivait (wrote):
| > je lis un fichier log ligne par ligne.
| > pour chaque ligne, je récupère certaines valeurs avec un split.
| > puis, j'alimente un hash de tableau : push @{$infos{$valeurs[0]}},
| > $valeurs[10];
| >
| > tout merche bien sauf que mon tableau $infos{$key} contient des
| > doublons.
| > existe-t-il un moyen de les éliminer, ou mieux de ne pas les
insérer,
| > ou bien je dois faire un sub qui analyse chaque tableau pour
chaque
| > clé ?
|
| Le réflexe lorsqu'on voit apparaître la notion d'unicité (ou la
| suppression des doublons), c'est la table de hachage.
|
| À la place de :
|
| # pour stocker
| push @{$infos{$valeurs[0]}}, $valeurs[10];
| ...
| # pour récuperer
| my $vals = @{$infos{$valeurs[0]}};
|
| On peut faire :
|
| # pour stocker
| $infos{$valeurs[0]}{$valeurs[10]}++;
| ...
| # pour récuperer
| my $vals = keys %{$infos{$valeurs[0]}};
|
| Comme ça, plus de doublons et au passage on compte le nombre
| d'occurence de chaque valeur. Par contre, on perd l'ordre
| d'insertion. Si on veut conserver l'ordre, on peut combiner les deux
| méthodes ou utiliser un module spécialisé (comme Tie::LLHash par
| exemple).

merci de ta réponse.

c'est une piste intéressante. j'ai, entre temps, re-re-re-lu
la perlfaq4 et j'ai modifié ma boucle d'analyse en conséquence,
mais avec deux lignes :

my %temp= map{$_,1} @{$infos{$thisHost}};
@{$infos{$thisHost}} = keys %temp;

mais j'atoute ta méthode dans mes "tips & tricks" :))

--
klp
Avatar
Paul Gaborit
À (at) Mon, 17 Sep 2007 13:47:40 +0200,
"kurtz_le_pirate" écrivait (wrote):
c'est une piste intéressante. j'ai, entre temps, re-re-re-lu
la perlfaq4 et j'ai modifié ma boucle d'analyse en conséquence,
mais avec deux lignes :

my %temp= map{$_,1} @{$infos{$thisHost}};
@{$infos{$thisHost}} = keys %temp;

mais j'atoute ta méthode dans mes "tips & tricks" :))


En fait, en faisant cela, tu stockes d'abord dans un tableau puis
ensuite tu passes par une table de hachage (temporaire) pour restocker
enfin dans un tableau. Ce que je proposais évite le passage initial
par un tableau...

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>