eliminer les doublons

Le
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Paul Gaborit
Le #152497
À (at) Mon, 17 Sep 2007 12:09:41 +0200,
"kurtz_le_pirate"
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 - Perl en français -
kurtz_le_pirate
Le #152496
"Paul Gaborit" de news:
|
| À (at) Mon, 17 Sep 2007 12:09:41 +0200,
| "kurtz_le_pirate" | > 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
Paul Gaborit
Le #152495
À (at) Mon, 17 Sep 2007 13:47:40 +0200,
"kurtz_le_pirate"
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 - Perl en français -
Publicité
Poster une réponse
Anonyme