[PERL] tableau <--> fichier

Fermé
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 - 18 déc. 2009 à 17:21
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 - 11 févr. 2011 à 10:52
Bonjour,

J'ai un script de traitement qui tourne à intervalle régulié pour parser des fichiers de logs. Mon problème est le suivant :

Pendant la lecture du fichier de log, je remplis un tableau :

my %tableau;

$tableau{$id} = $from;

et parfois j'utilise :
$from=$tableau{$id}

mon problème est que je coupe le fichier de log un peu n'importe où donc quand je fais $from=$tableau{$id} il est possible que la valeur ne soit pas dans le tableau car présente plus haut dans le fichier de log DEJA traité lors du précédent appel....


Je souhaite donc sauvegarder/recharger le tableau en fin et debut de script depuis un fichier MAIS ... je dois aussi sortir du tableau les éléments trouvés pour ne pas les sauvegarder et avoir ainsi un tableau en croissance permanente ...

Je ne sais pas si c'est très clair....

Merci de poser des questions si non ...

Merci d'avance.

Stéphane
A voir également:

4 réponses

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
6 mai 2010 à 20:31
Salut,

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

my $fichier_hold="data.dat";
my %hash;

open FICHIER_HOLD,"<$fichier_hold" 
  or print "E/S $fichier_hold : $!" ;
while (<FICHIER_HOLD>) {
  next unless /:/;
  chomp;
  my ($cle,$valeur) = split /:/;
  $hash{$cle} = $valeur;
  print "$cle : $hash{$cle}\n";
}
close FICHIER_HOLD;
__END__



1
Salut,

$from=$tableau{$id} il est possible que la valeur ne soit pas dans le tableau car présente plus haut dans le fichier de log DEJA traité lors du précédent appel....

C'est normal et en plus elle devrait être dans le tableau de l'appel précèdent, non?

1. Exemple de fichiers
2. Le script
3. Que veut tu obtenir comme résultat?
Si tu fais une boucle $from qui est une variable scalaire contiendra toujours autre chose.

Je souhaite donc sauvegarder/recharger le tableau en fin et debut de script
Ce qui suppose la sauvegarde de ton tableau dans un fichier puisqu'au redémarrage de script les variables sont réinitialisées.

En bref, au début de script tu pourras par exemple charger ton tableau depuis le fichier de sauvegarde.
A priori, vu que seulement les valeurs te pose de problèmes alors il faut sauvegarder seulement les clé de hash.

Un exemple concret permettra de penser à une solution.
Merci.
0
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 2
18 déc. 2009 à 17:57
bonsoir,

je m'y colle dans le WE et je post lundi, merci !

Stéphane
0
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 2
6 mai 2010 à 18:05
Bonjour,

Je reviens, enfin, à l'attaque sur ce sujet, j'ai progressé mais j'ai un petit soucis.

prenons un fichier data.dat au format : clef|valeur

#cat data.dat
clef1:valeur1
clef2:valeur2
...
clef33340430:valeur2334545


je souhaite lire le fichier et remplir (initialiser) un hash avec :

$fichier_hold="data.dat";

open(FICHIER_HOLD,"<$repertoire_destinataire/$fichier_hold") or print FICHIER_ERROR ("Erreur lors de la lecture de $repertoire_destinataire/$fichier_hold") ;
while (<FICHIER_HOLD>) {
        chomp;
        (($clef,$tableau{$clef}) = /([^|]+)\|(.*)$/o);
        print "$clef : $tableau{$clef}\n";
}
close(FICHIER_HOLD);


or le print ne me renvois que les clef et : mais pas de valeur ...
ais-je une erreur dans l'expression régulière ? ou bien on ne peut pas attribuer directement la valeur au tableau et il faut un variable intermédiaire ?

Merci d'avance ...
0
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 2
2 févr. 2011 à 14:52
Bonjour,

je souhaite ajouter un paramètre date_heure à chaque entrée, comment puis-je modifier le tableau pour avoir une entrée de plus ?

genre :

$hash{$cle} = $valeur;
devient : $hash{$cle}.valeur=$valeur;
et : $hash{$cle}.dateheure=$date_heure;

partant d'un fichier sous la forme : 

CLEF|VALEUR|DATE_HEURE
CLEF|VALEUR|DATE_HEURE
CLEF|VALEUR|DATE_HEURE


Merci d'avance !!

Stéphane
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
2 févr. 2011 à 19:58
Salut,

Je n'ai pas compris.

Tu ne veux pas plutôt

$hash{$cle1}{$cle2} = "quelquechose"

?
En ce cas il faut bien sûr être sûr que cle1 et cle2 sont uniques.
Il s'agit dans hash de hash dans ce cas.
0
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 2
3 févr. 2011 à 10:06
bonjour,

non du tout, je veux ajouter une valeur qui me sert à purger, la même valeur pouvant être présente pour plusieurs clef (c'est la date de péremption de la clef en gros)

stephane
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
3 févr. 2011 à 18:04
Salut,

Comme on a la clé déjà unique alors il sufira peut être que tu concatene la cle avec la valeur ou avec la date_heure

Ca donnera plutôt

$hash{$cle} = $valeur;
devient :
$hash{$cle_valeur}=$valeur;
et :
$hash{$cle_dateheure}=$date_heure;
0
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 2
10 févr. 2011 à 17:25
oui ou alors je fait un second hash distinct du premier dont la valeur est date_heure ...
$hash{$cle}=$valeur;
$hash2{$cle}=$date_heure;

stéphane
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
10 févr. 2011 à 21:51
Salut,

En ce cas tu peux faire un seul hash ou tu as la clé et la valeur est un tableau anonyme avec deux éléments $valeur et $date_heure

lami20j@debian-acer:~$ cat val_dateheure 
cle1|valeur1|date_heure1
cle2|valeur2|date_heure2
lami20j@debian-acer:~$ cat hashdetableau.pl 
#!/usr/bin/perl
use strict;use warnings;
my %h;
open F,"val_dateheure" or die "E/S : $!\n";

while(<F>){
  /(.*)\|(.*)\|(.*)/ and push @{$h{$1}},$2,$3;
} 

foreach (sort keys %h){
  print "$_ => ${$h{$_}}[0] ${$h{$_}}[1]\n";
}
__END__

lami20j@debian-acer:~$ perl hashdetableau.pl
cle1 => valeur1 date_heure1
cle2 => valeur2 date_heure2
0