[PERL] tableau <--> fichier
sbouli
Messages postés
200
Date d'inscription
Statut
Membre
Dernière intervention
-
sbouli Messages postés 200 Date d'inscription Statut Membre Dernière intervention -
sbouli Messages postés 200 Date d'inscription Statut Membre Dernière intervention -
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
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:
- [PERL] tableau <--> fichier
- Fichier bin - Guide
- Tableau word - Guide
- Fichier epub - Guide
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
4 réponses
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__
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.
$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.
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
je souhaite lire le fichier et remplir (initialiser) un hash avec :
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 ...
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 ...
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 :
Merci d'avance !!
Stéphane
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
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
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