[PERL] tableau <--> fichier

sbouli Messages postés 208 Statut Membre -  
sbouli Messages postés 208 Statut Membre -
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

4 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  2. lami20j
     
    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
    1. sbouli Messages postés 208 Statut Membre 2
       
      bonsoir,

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

      Stéphane
      0
  3. sbouli Messages postés 208 Statut Membre 2
     
    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
  4. sbouli Messages postés 208 Statut Membre 2
     
    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
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      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
    2. sbouli Messages postés 208 Statut Membre 2
       
      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
    3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      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
    4. sbouli Messages postés 208 Statut Membre 2
       
      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
    5. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      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