Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3049 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2  3  4  5  6  7
Auteur Sujet :

[Résolu] Export données en perl

n°2224523
gilou
Modérateur
Modzilla
Posté le 09-04-2014 à 03:34:14  profilanswer
 

Reprise du message précédent :
Les valeurs reçues sont dans un hash %values dont les clés sont les mêmes que celles du hash %params dorénavant.
La technique pour ordonner les clés du hash et faire une boucle sur les clés ordonnées est utilisée dans la version antérieure du code, il vous suffit de l'adapter ici.
 
Note: pour mettre au point, je vous conseille d'ajouter
use Data::Dumper;
dans la liste des use en tête de fichier, et de faire
print Dumper($var);  
pour voir ce que contient une variable qui peut être un scalaire ($var), une liste (@var), un hash (%var), etc.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
mood
Publicité
Posté le 09-04-2014 à 03:34:14  profilanswer
 

n°2224529
clubber43
Posté le 09-04-2014 à 08:36:22  profilanswer
 

Sa marche.  
Merci pour la réponse (à une heure aussi tardive ^^)
 
Je n'ai pas eu le temps de le voir avant :)
 
@+
 

n°2224541
clubber43
Posté le 09-04-2014 à 09:57:45  profilanswer
 

J'ai essayé de refaire le script avec l'impression dans un fichier csv.
Par contre, il faut faire un export de quelle variable dans le fichier vu qu'on a soit des variables à 1-2 ou 3mots ?  
Ou alors, la variable %result a deja toute les valeurs ?  
 
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Socket;
  5. use Data::Dumper;
  6. # Paramètres ModBus/TCP
  7. my $MODBUS_PORT                                 = 502;
  8. use constant {
  9.   # Codes fonctions lecture, ecriture, ...
  10.   READ_COILS                                    => 0x01, # R1
  11.   READ_DISCRETE_INPUTS                          => 0x02, # R2
  12.   READ_HOLDING_REGISTERS                        => 0x03, # R3
  13.   READ_INPUT_REGISTERS                          => 0x04, # R4
  14.   WRITE_SINGLE_COIL                             => 0x05, # R5
  15.   WRITE_SINGLE_REGISTER                         => 0x06, # R6
  16.  
  17.   # Codes exceptions erreurs, ...
  18.   EXP_ILLEGAL_FUNCTION                          => 0x01,
  19.   EXP_DATA_ADDRESS                              => 0x02,
  20.   EXP_DATA_VALUE                                => 0x03,
  21.   EXP_SLAVE_DEVICE_FAILURE                      => 0x04,
  22.   EXP_ACKNOWLEDGE                               => 0x05,
  23.   EXP_SLAVE_DEVICE_BUSY                         => 0x06,
  24.   EXP_MEMORY_PARITY_ERROR                       => 0x08,
  25.   EXP_GATEWAY_PATH_UNAVAILABLE                  => 0x0A,
  26.   EXP_GATEWAY_TARGET_DEVICE_FAILED_TO_RESPOND   => 0x0B,
  27. };
  28. # Valeurs par défaut / initialisation des variables
  29. my $opt_server                                  = 'localhost';
  30. my $opt_server_port                             = $MODBUS_PORT; #502
  31. my $opt_timeout                                 = 1; # temps max de 1s
  32. my $opt_unit_id                                 = 1;
  33. my $opt_mb_ad;
  34. my $opt_mb_fc                                   = READ_HOLDING_REGISTERS; #fonction R3 de lecture
  35. my $opt_mb_nb                                   = 1;
  36. my $opt_bit_value                               = 0;
  37. my $opt_word_value                              = 0;
  38. $opt_server = '172.17.14.3';             # @ IP du serveur TCP en dure => Version V4 avec boucle de lecture des @IP.txt
  39. my $server_ip = inet_aton($opt_server);      # on donne l'@ IP à la variable
  40. unless ($server_ip) {
  41.   print STDERR 'unable to resolve "'.$opt_server.'"'."\n"; # et la,
  42.   exit 1;
  43. }
  44. my $status = query_info();
  45. until ($status) {
  46.   sleep( );             # toutes les 10s, a adapter à ses besoins
  47.   $status = query_info();
  48. }
  49. # boucle infinie, a stopper avec un kill
  50. sub query_info{
  51.   # Gestion du dialogue reseau
  52.   # Ouverture de la session TCP
  53.   socket(SERVER, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
  54.   unless (connect(SERVER, sockaddr_in($MODBUS_PORT, $server_ip))) {
  55.     print STDERR 'connexion au serveur "'.$server_ip.':'.$MODBUS_PORT.'" impossible'."\n";
  56.     return 2;
  57.   }
  58.   my %parametres;
  59. # Rentrez ici les données à extraire du compteur
  60. # Nom          Adresses Hexa    Nb Mots    Signé ou non.
  61.    # déphasage
  62.   $parametres{"DEPHASAGE_1"} = {address => 0x18, size => 1, signed => 0};
  63.   $parametres{"DEPHASAGE_2"} = {address => 0x19, size => 1, signed => 0};
  64.   $parametres{"DEPHASAGE_3"} = {address => 0x1A, size => 1, signed => 0};
  65.   $parametres{"DEPHASAGE_M"} = {address => 0x1B, size => 1, signed => 0};
  66.   # puissance
  67.   $parametres{"PUISSANCE P"} = {address => 0x109, size => 3, signed => 0};
  68.   $parametres{"Partiel NRJ"} = {address => 0x41E, size => 3, signed => 0};
  69.   my %result;
  70.   foreach (sort {$a cmp $b} (keys %parametres)) {
  71.     $opt_mb_ad = $parametres{$_}->{address};
  72.     $opt_mb_nb = $parametres{$_}->{size};
  73.     # Création de la requête
  74.     my $tx_hd_tr_id   = int(rand 65536);
  75.     my $tx_hd_length  = 6;
  76.     my $tx_hd_pr_id   = 0;
  77.     my $tx_buffer = pack("nnnCCnn", $tx_hd_tr_id, $tx_hd_pr_id , $tx_hd_length, $opt_unit_id, $opt_mb_fc, $opt_mb_ad, $opt_mb_nb);
  78.     # Emission de la requête vers le serveur
  79.     send(SERVER, $tx_buffer, 0);
  80.     # Attente d'une réponse
  81.     unless (can_read(\*SERVER, $opt_timeout)) {
  82.       close SERVER;
  83.       print STDERR 'receive timeout'."\n"; # erreur si depassement du temps d'attente
  84.       return 1;
  85.     }
  86.     # Réception de l'entête depuis le serveur
  87.     my ($rx_frame, $rx_buffer);
  88.     recv(SERVER, $rx_buffer, 7, 0); #codé en 8bits
  89.     $rx_frame = $rx_buffer;
  90.     # Décodage de l'entête
  91.     my ($rx_hd_tr_id, $rx_hd_pr_id, $rx_hd_length, $rx_hd_unit_id) = unpack "nnnC", $rx_buffer;
  92. #le nnn signifie qu'il y a 3 mots à decoder
  93.     # Vérifie la cohérence de l'entête
  94.     unless (($rx_hd_tr_id == $tx_hd_tr_id) &&
  95.         ($rx_hd_pr_id == 0) &&
  96.         ($rx_hd_length < 256) &&
  97.         ($rx_hd_unit_id == 1)) {
  98.       close SERVER;
  99.       print STDERR 'error in receive frame'."\n";
  100.       return 1;
  101.     }
  102.     # Réception du corps du message (mots à lire dans la requete
  103.     recv(SERVER, $rx_buffer, $rx_hd_length-1, 0);
  104.     $rx_frame .= $rx_buffer;
  105.     # Décodage du corps du message
  106.     my ($rx_bd_fc, $rx_body) = unpack "Ca*", $rx_buffer;
  107.     # Vérification du statut d'exception
  108.     if ($rx_bd_fc > 0x80) {
  109.       # Affichage du code exception
  110.       my ($rx_except_code) = unpack "C", $rx_body;
  111.       print 'exception (code '.$rx_except_code.')'."\n";
  112.     } else {
  113.       ## Lecture de mot, si plusieus mots, lecture de chaque puis boucle If suivante :
  114.       my ($rx_bd_bc, $rx_read_word_data) = unpack "Ca*", $rx_body;
  115.       my ($val1, $val2, $val3); # 1 variable par mot lu,
  116. #Si 
  117.       if ($opt_mb_nb == 1) {
  118.     $result{$opt_mb_ad} = unpack 'n', ($rx_read_word_data);
  119.     if ($parametres{$_}->{signed} ){
  120.       $result{$opt_mb_ad} -= 2**16;
  121.     }
  122.       }
  123.       elsif ($opt_mb_nb == 2) {
  124.     ($val1, $val2) = unpack 'nn', $rx_read_word_data;
  125.     $result{$opt_mb_ad} = ($val1 * (2**16) * 0.1) + ($val2 * 0.1);
  126.     if ($parametres{$_}->{signed}) {
  127.       $result{$opt_mb_ad} -= 2**32;
  128.     }
  129.       }
  130.       elsif ($opt_mb_nb == 3) {
  131.     ($val1, $val2, $val3) = unpack 'nnn', $rx_read_word_data;
  132.     $result{$opt_mb_ad} = ($val1 * (2**32) * 0.1 + $val2 * (2**16) * 0.1 + $val3 * 0.1)/1000; #remplace exposant ** <> ^
  133.     if ($parametres{$_}->{signed}) {
  134.       $result{$opt_mb_ad} -= 2**48;
  135.     }
  136.       }
  137.     }
  138.   }
  139.   close SERVER;#fin de dialogue avec le serveur de données.
  140.   # fin de la boucle foreach
  141.   # impression en console
  142. # Affichage des valeurs recues
  143. sub disp_data { 
  144.   my %result = @_;
  145.   open(my $fh, ">>", 'C:/test.csv' ) || die ('Impossible d\'ouvrir le fichier "c:/test.csv"' ); 
  146.   print $fh "$_;$result{$_};" foreach (keys %result));
  147.   print $fh, "\n";
  148.   close ($fh);
  149.   print "\n";
  150.   #attente $timeout
  151.   sub can_read{
  152.     my ($sock_handle, $timeout) = @_;
  153.     my $hdl_select="";
  154.     vec($hdl_select, fileno($sock_handle),1)=1;
  155.     return (select($hdl_select, undef, undef, $timeout)==1);
  156.   }
  157. # création de la variable timestamp pour 
  158.   my $time = time;
  159.   my @months = ("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec" );
  160.   my ($sec, $min, $hour, $day,$month,$year) = (localtime($time))[0,1,2,3,4,5];
  161.   print "timestamp : ".$time. " \n";
  162. }


 
Merci

n°2224556
gilou
Modérateur
Modzilla
Posté le 09-04-2014 à 10:59:21  profilanswer
 

clubber43 a écrit :

Ou alors, la variable %result a deja toute les valeurs ?  
 
Merci

gilou a écrit :


Note: pour mettre au point, je vous conseille d'ajouter
use Data::Dumper;
dans la liste des use en tête de fichier, et de faire
print Dumper($var);  
pour voir ce que contient une variable qui peut être un scalaire ($var), une liste (@var), un hash (%var), etc.

D'autre part, je ne vois pas à quoi va vous servir ici de continuer sur l'ancien code, lequel n'est pas architecturé pour plus d'un serveur.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2224560
clubber43
Posté le 09-04-2014 à 11:15:35  profilanswer
 

En partant avec le new code, je peux quand même avoir l'export en csv du coup ?  
 
J'ai installé activePerl et j'ai ma fenetre  PPm qui s'affiche.
Parcontre, comment se servir de activePerl et de PPM

n°2224568
clubber43
Posté le 09-04-2014 à 11:26:30  profilanswer
 

Du coup, je suis reparti du programme new et j'ai compilé tout ça (sans Cron du coup)  
J'ai mis en commentaire les lignes avec Cron / DateTime
 
Et j'ai une erreur sur -> Can't locate ojbect method "params" via package "courant_1"
perhaps you forgot to load "Dephasage_1"

n°2224577
gilou
Modérateur
Modzilla
Posté le 09-04-2014 à 12:09:17  profilanswer
 

Dans get_values, il manque un $ devant le params, c'est sans doute la cause du pb.
my ($status, $val) = get_value($connection, $params{$_});
 
Et si vous mettez en commentaire les lignes pour cron, il faut au moins le premier appel a session() pour que quelque chose se passe.
 
> En partant avec le new code, je peux quand même avoir l'export en csv du coup ?  
A l'endroit ou un log_write est (et a écrire), vous faites ce que vous voulez pour afficher ou sauver le résultat.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2224584
clubber43
Posté le 09-04-2014 à 13:13:40  profilanswer
 

Ok, je teste tout ça cette aprem et je posterais si pb.
 
Merci

n°2224588
clubber43
Posté le 09-04-2014 à 13:27:55  profilanswer
 

C'est impécable, le script marche nikel !!
 
Je fait les modifs pour l'export etje repasserais ce soir.
 
Merci Gilou,
ET respect pour le codage, c'est du propre et facile à comprendre avec els commentaires!

n°2224590
clubber43
Posté le 09-04-2014 à 13:40:28  profilanswer
 

Donc en fait,  
 
En partant de sa

Code :
  1. #log_write($logfile, $_, %values);

qui est en quelques sorte le prototype de la fonction,
je créé ma fonction qui va imprimé les valeurs dans un fichier txt ou csv, a definir selon mon besoin;
 
Si je suis l'arborescence du projet, c'est comme ça que l'on procede, et du coup le programme est plus lisible.
Et plus simple à maintenir ^^.  
 
Cela evite ne fait d'avoir beaucoup de script à la suite, et d'avoir un script structuré.
 
Question HS, on peut créer des .H comme en cpp pour les fonction en PERL ?

Message cité 1 fois
Message édité par clubber43 le 09-04-2014 à 13:43:18
mood
Publicité
Posté le 09-04-2014 à 13:40:28  profilanswer
 

n°2224595
gilou
Modérateur
Modzilla
Posté le 09-04-2014 à 13:58:59  profilanswer
 

clubber43 a écrit :

Donc en fait,  
 
En partant de sa

Code :
  1. #log_write($logfile, $_, %values);

qui est en quelques sorte le prototype de la fonction,
je créé ma fonction qui va imprimé les valeurs dans un fichier txt ou csv, a definir selon mon besoin;
 


Voila!
 
Pas de .h en perl
Il suffit que la fonction soit dans le module pour que l'interpréteur l'utilise.
 
A+,

n°2224597
clubber43
Posté le 09-04-2014 à 14:00:28  profilanswer
 

OK,  
En même temps que j'apprend, je faits la passerelle avec le C.
Quand c'est possible ^^

n°2224598
gilou
Modérateur
Modzilla
Posté le 09-04-2014 à 14:03:53  profilanswer
 

Ce qu'il reste encore a faire pour le script, c'est de décider ce que tu vas faire quand il y a des erreurs (tel qu'il est fait, les erreurs ne vont rien faire de particulier au script à priori, au pire, il n'y aura pas de résultat s'il n'arrive pas a causer a un serveur, mais tu peux vouloirs logger les erreurs qque part, ou envoyer un message en console, "WARNING: host ... unreachable!", etc).
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2224606
clubber43
Posté le 09-04-2014 à 14:36:33  profilanswer
 

Pour la gestion des erreurs, si jamais une adresse de ne répond pas, le script av continé à s'executer ou va s'arreter?  
 
Parsque là, je peux avoir un fichier txt qui est créé et qui dit:  
Errer : host unreachable le hh/jj/mm/2014
Errer : host unreachable le hh/jj/mm/2014...
 
Ces infos peuvent etre utilisées pour renseigner un fichier qualite par exemple? ou alors pour dire, attention, tel jour à telle heuren bug du reseau...
 
Je reflechis à cette question, et je reviendrais ici.
 
Merci pour l'idée, je la garde de coté.
Actuellement, je travaille sur l'export en csv des données.

n°2224611
gilou
Modérateur
Modzilla
Posté le 09-04-2014 à 14:44:49  profilanswer
 

clubber43 a écrit :

Pour la gestion des erreurs, si jamais une adresse de ne répond pas, le script av continé à s'executer ou va s'arreter?  
Il va passer au serveur suivant. Et si un serveur ne répond pas dans le bon délai pour une valeur, il arrête de demander à ce serveur et passe au serveur suivant.
 
Parsque là, je peux avoir un fichier txt qui est créé et qui dit:  
Errer : host unreachable le hh/jj/mm/2014
Errer : host unreachable le hh/jj/mm/2014...
 
Ces infos peuvent être utilisées pour renseigner un fichier qualite par exemple? ou alors pour dire, attention, tel jour à telle heuren bug du reseau...
 
Je reflechis à cette question, et je reviendrais ici.
Voila. Pour le moment, en cas d'erreur, le code revient avec 0 dans la fonction en cours, mais on peut faire plus précis si necessaire.

Merci pour l'idée, je la garde de coté.
Actuellement, je travaille sur l'export en csv des données.


Exporter en CSV les données, c'est rien du tout, juste un print bien formaté dans un fichier.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2224620
clubber43
Posté le 09-04-2014 à 14:57:15  profilanswer
 

Plus precis, cela pourrais passer par un message exporté vers un fichier en disant l'erreur et la date...
 
J'y reflechis ce soir, c'est vraiment pas bete en plus.
Comme sa, si pb dans les valeurs, on peut voir s'il y a eu un souci à la lecture ou a la connexion.
 
Pas mal en tout cas,
 
 
@@

n°2224646
clubber43
Posté le 09-04-2014 à 17:12:13  profilanswer
 

Petite question, dans mes fichier en csv,  
 
Peut on exporter une valeur par colonne de un fichier .csv  :  
 
j'ai trouvé ça => use Text::CSV
 
Je continue mes recherhces
 
merci

n°2224664
gilou
Modérateur
Modzilla
Posté le 09-04-2014 à 21:07:32  profilanswer
 

La c'est même encore plus simple: Comme tout est dans un hash, il suffit de sauver les valeurs du hash dans l'ordre qu'on veut (avec un tri sur les clés du hash par exemple) en séparant par des ; (ou des ,)
Et si on fait pareil en premier pour les clés du hash, ça nous donnera la ligne d'en tête.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2224683
clubber43
Posté le 10-04-2014 à 08:38:24  profilanswer
 

C'est à dire, que pour la sauvegarde des valeurs :  
 

Code :
  1. sub disp_data
  2. {
  3.  open(my $fichier, ">>", 'D:/test4.csv' ) || die ('Impossible de créer le fichier "D:/test.csv"' );
  4.  foreach (@_)
  5.   {
  6.      printf( $fichier "%d;",$_); #resultats des mots
  7.   printf( $fichier "%d;",$time ); #resultat de la variable Time
  8.   }
  9.  printf ($fichier "\n" );
  10. close ($fichier);
  11. }


 
Il faut codé les entetes et ordre dans la fonction sub_data du coup ?  
Ou alors créer une structure avant, je ne vois pas trop comment on peut ranger les valeurs.
 
Je regarde sa ce matin.
 
Merci

n°2224685
clubber43
Posté le 10-04-2014 à 08:45:33  profilanswer
 

C'est bon, j'ai trouve pour mettre en forme les colonnes et les lignes.
Effectivement, un peu de recherche et d'essais, sa va relativement bien !!
 
Parcontre pour les entetes, je vois pas trop comment on peut les mettre, il faut dire a la sub_data qu'il faut mettre les entetes à la ligne 0 et les données a la ligne +1 et ainsi de suite?  
 
merci

n°2224687
clubber43
Posté le 10-04-2014 à 08:57:58  profilanswer
 

Ah,  
je reviens un peu en arriere, quand je créé mon fichier en xls, j'ai bien mes 2 colonnes avec ma valeurs consommée et la valeur de timestamp.
Mais en dessous, j'ai la deuxieme valeur de consommation qui devrait etre à coté :  

Code :
  1. Colonne 1                           Colonne 2
  2. 37318764.........................1397112596
  3. 37318812.........................1397112596
  4. 37318865.........................1397112597
  5. 37318920.........................1397112599


 
Et je devrais avoir en fait (sans les points biensur ^^) :
 

Code :
  1. Colonne 1                           Colonne 2                           Colonne 3
  2. 37318764.........................37318812 .........................1397112596
  3. 37318865 ........................37318920 .........................1397112599


 
Du coup, je pense qu'il y a un souci dans le code de l'export dans sub_data

Code :
  1. printf( $fichier "%d;",$_); #resultats des mots


 
J'y regarde de plus près.
 
PS : quand on créé un fichier .csv ou .xls avec le script, il y a une difference? sans tenir compte de la mise en forme des valeurs, ... mais au niveau exploitation derriere ?
 
merci


Message édité par clubber43 le 10-04-2014 à 08:59:18
n°2224710
gilou
Modérateur
Modzilla
Posté le 10-04-2014 à 11:37:00  profilanswer
 

Bon, je tr réponds avec un exemple trivi


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2224711
gilou
Modérateur
Modzilla
Posté le 10-04-2014 à 11:37:00  profilanswer
 

Bon, je tr réponds avec un exemple trivi


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2224712
clubber43
Posté le 10-04-2014 à 11:38:57  profilanswer
 

Ok, mais je remet juste ce que j'ai faits depuis tte.
j'arrive bien a exporter mes datas, mais la mise ne forme n'est pas encore là.
 
J'ai toujours avec la boucle :  

Code :
  1. sub disp_data
  2. {
  3.  open(my $fichier, ">>", 'D:/testV5.csv' ) || die ('Impossible de créer le fichier "D:/test.csv"' );
  4.  foreach (@_)
  5.   {
  6.      printf( $fichier "%d;",$_); #resultats des mots
  7.   printf( $fichier "%d;",$time ); #resultat de la variable Time
  8.   }
  9.  printf ($fichier "\n" );
  10. close ($fichier); 
  11. }


 
Et j'obtiens comme resultats dans mon fichier csv:
 
resultatmot1timestamp1
resultatmot2timestamp1
resultatmot1timestamp2
resultatmot2timestamp2
 
 
Merci gilou;

n°2224714
gilou
Modérateur
Modzilla
Posté le 10-04-2014 à 11:51:39  profilanswer
 

Bon, je te réponds avec un exemple trivial:
 
 

Code :
  1. my %hash;
  2.  
  3. $hash{"riri"} = "Donald";
  4. $hash{"fifie"} = "Daisy";
  5. $hash{"loulou"} = "Picsou";
  6.  
  7.  
  8. # impression de l'en-tête
  9. foreach (keys %hash) {
  10.    print "$_\t";
  11. }
  12. print "\n";
  13. # et des valeurs
  14. foreach (keys %hash) {
  15.    print "$hash{$_}\t";
  16. }
  17. print "\n\n";
  18.  
  19.  
  20. ## impression par ordre alphabétique des clés
  21. my @a = sort {$a cmp $b}(keys %hash);
  22.  
  23. # impression de l'en-tête
  24. foreach (@a) {
  25.    print "$_\t";
  26. }
  27. print "\n";
  28. # et des valeurs
  29. foreach (@a) {
  30.    print "$hash{$_}\t";
  31. }
  32. print "\n\n";
  33.  
  34.  
  35. ## impression par longueur des clés
  36. @a = sort {length($a) <=> length($b)}(keys %hash);
  37.  
  38. # impression de l'en-tête
  39. foreach (@a) {
  40.    print "$_\t";
  41. }
  42. print "\n";
  43. # et des valeurs
  44. foreach (@a) {
  45.    print "$hash{$_}\t";
  46. }
  47. print "\n\n";


 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2224721
clubber43
Posté le 10-04-2014 à 13:06:13  profilanswer
 

Ok,  
Je peux l'adapter à mon export CSV aussi du coup;
 
Je regarde le code, et je reviens dès que j'ai avancé le script
 
Merci pour l info.

n°2224724
clubber43
Posté le 10-04-2014 à 13:38:50  profilanswer
 

Le seul hic, enfin pour moi,  
C'est quand il y a :  
 

Code :
  1. my %hash;
  2. $hash{"riri"} = "Donald"; => Comment lui donner la valeur de la variable lue dans le compteur ? avec %result?
  3. $hash{"fifie"} = "Daisy";
  4. $hash{"loulou"} = "Picsou";


 
Parsqu en fait, on lui donne la valeur a exporter dans le fichier, et avec la bouce, on le fait pour chaque parametre de chaque champ si j'ai suivi.
 
Du coup, il faut que la boucle soit refaite et repensée avec les nouvelles modifs.
 
@+

n°2224727
gilou
Modérateur
Modzilla
Posté le 10-04-2014 à 14:28:51  profilanswer
 

Tu as été faire un print Dumper(%result), comme je t'ai indiqué?
Manifestement non.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2224728
clubber43
Posté le 10-04-2014 à 14:30:29  profilanswer
 

Si j'ai bien fait le dumper mais j'avais pas fait le rapprochement avec . . .  
 
VAR1 ...
VAR2 ...
VAR3 ...

n°2224730
clubber43
Posté le 10-04-2014 à 14:33:36  profilanswer
 

qui sont du coup,  
 
$hash{"riri"} = "Donald";
$hash{"fifie"} = "Daisy";
$hash{"loulou"} = "Picsou";

n°2224733
clubber43
Posté le 10-04-2014 à 14:45:31  profilanswer
 

Bon, un peu sale mais pour voir, c'est deja bien.
J'ai fait cela :

Code :
  1. sub session ()
  2. {
  3.    my $logfile = 'C:/modlog.txt';
  4.    my @servers = make_servers_list('D:/julien/adresses_ip.txt');
  5.    my %params = make_params_list();
  6.  
  7.  foreach (@servers)
  8. {
  9.      my $connection = start_connection($_);
  10.       next unless ($connection);
  11.    
  12.  my %values = get_values($connection, %params);
  13.      # log_write($logfile, $_, %values);
  14.      end_connection($connection);
  15.      print Dumper(%values),"\n";
  16. #######################
  17. # impression de l'en-tête
  18. foreach (keys %params)
  19.  {
  20.       print "$_\t";
  21.  }
  22.   print "\n";
  23. # et des valeurs
  24.  foreach (keys %params)
  25.  {
  26.       print "$params{$_}\t";
  27.  }
  28.   print "\n\n";
  29. ########################
  30.      undef $connection;
  31.    }
  32. }


 
Et j'obtient bien l'indentation mais pour les valeurs, j'ai  :
 
HASH (0x26cf60)
 
Soit une valeur en gexa mais du coup pas de valeur numeriques.
 
merci

n°2224738
clubber43
Posté le 10-04-2014 à 16:16:50  profilanswer
 

Pas d'ameliorations sur mon code depuis cette après-midi, je bloque sur le print,  
Je n'ai pas compris pourquoi il n'affichait pas la bonne valeur.  
 
Mais j'ai testé pas mal de solutions, et je retrouve toujours la valeur en hexa : HASH (0x26cf60)  ou HASH (0x55cf60).
 
Pour les exports vers le fichier, je continue de travailler dessus, mais pas d'export, le fichier csv reste vide;
 
Je suis un peu :pt1cable: là, car je me perds entre les _$, %result, .. ^^
 
Mais sa va y aller bientot, il manque pas grand chose je le sens
 
@9+


---------------
Merci
n°2224759
gilou
Modérateur
Modzilla
Posté le 10-04-2014 à 19:17:50  profilanswer
 

C'est pourtant très simple:
 
vous faites foreach (keys %params)  
et comme %params est un hash dont les valeurs sont des références (anonymes) a un hash, vous obtenez logiquement comme valeur HASH (0x26cf60)  ce qui vous indique que vous avez un scalaire (de valeur 0x26cf60) qui est l'adresse d'un HASH.
 
Ce que vous auriez du faire, c'est foreach (keys %values) car %values est lui un hash dont les valeurs sont des scalaires.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2224792
clubber43
Posté le 11-04-2014 à 09:15:24  profilanswer
 

C'est OK Gilou, j'ai commence à comprendre la difference entre les différents valeurs, parametres, .. des hash. C'est assez dur
Quand on vient du C car ils n'existent pas.
 
Les sructures assez difficiles en C se limitaient aux pointeurs, du coup, j'ai un peu mélangés les pinceaux  :)  
 
Du coup, maintenant que j'ai mon export qui fonctionne et qui est structuré,
j'ai commencé à regarder pour créer mon export vers CSV.  
 

Code :
  1. # création de la variable timestamp pour 
  2. my $time = time;
  3. my @months = ("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec" );
  4. my ($sec, $min, $hour, $day,$month,$year) = (localtime($time))[0,1,2,3,4,5];
  5. print "timestamp : ".$time. " \n";


 
 
 

Code :
  1. open(my $fichier, ">>", 'D:/julien/testV4.csv' ) || die ('Impossible de créer le fichier "D:/test.csv"' );
  2.  foreach (keys %values)
  3.   {
  4.   printf($fichier "%s;",$values{$_},";$time;",@servers);
  5.   }
  6.  printf($fichier "\n" );
  7.  close($fichier);


 
J'ai toujours mon ouverture de ficher, la boucle qui a chaque parametres vas imprimer le resultat dans le fichier et mon printf qui va imprimer mon adresse IP
dans la colonne suivante. (comme sa, j'ai l 'info des Compteurs qui ont été interrogés).
 
Mais j'ai un bug à la compile, je n'arrive pas imprimer les adresses IP des compteurs et la variable TimeStamp. pourtant, je mets bien @servers dans ma boucle de printf.
A mon avis, je dois mal interpréter les variables ou alors mal rangées dans mon printf . . .  
 
Et ce soir, le script rentre en prod ^^
Derniere ligne droite
 
 
Merci pour le coup de main
 

n°2224809
clubber43
Posté le 11-04-2014 à 10:27:57  profilanswer
 

Code :
  1. ##################### # impression CSV
  2.  open(my $fichier, ">>", 'D:/julien/energie.csv' ) || die ('Impossible de créer le fichier "D:/julien/energie.csv"' );
  3.   foreach (keys %values)
  4.    {
  5.    printf($fichier "%d;",$values{$_});
  6.    }
  7.   printf($fichier "$time;" );
  8.   printf($fichier "@servers" );
  9.   printf($fichier "\n" );  # Saut de ligne à la fin de chaque boucle
  10.  close($fichier);  # Fermeture et sauvegarde fichier csv
  11.  ########################


 
Bon, bien voila après moultes recherches j'ai enfin trouvé le truc pour imprimer les valeurs et l'adresse ip et le timestamp ^^
 
Et sur mon fichier, j'ai bien une case par valeur et une ligne par compteur.
 
Ben voila; le projet a super bien avancé, merci pour toute ton aide Gilou et pour la patience . . .  
 
Mais aujourd'hui je suis super content!!
 
Maintenant commence la 2eme partie, les macros pour exploiter les datas !!
 
Merci

n°2224846
clubber43
Posté le 11-04-2014 à 13:35:38  profilanswer
 

Re ^^
 
Après un essai durant le temps de midi, petit bug de l'export.
 
Dans ma boucle d'export des datas, lorsque j'exporte la valeur de l'adresse IP consultée, le script me renvoie
toutes les adresses du fichier TXT.
 
Je pense qu'il y a un souci dans mon script sur la boucle  du printf.
 

Code :
  1. ##################### # impression CSV
  2. open(my $fichier, ">>", 'D:/julien/energie.csv' ) || die ('Impossible de créer le fichier "D:/julien/energie.csv"' );
  3.   foreach (keys %values)
  4.    {
  5.    printf($fichier "%d;",$values{$_});
  6.     }
  7.    printf($fichier "$time;" );
  8.   printf($fichier "@servers" );
  9.    printf($fichier "\n" );  # Saut de ligne à la fin de chaque boucle
  10.   close($fichier);  # Fermeture et sauvegarde fichier csv


 
Une derniere faveur Gilou, après j'arette  ;)  
 
merci


Message édité par clubber43 le 11-04-2014 à 15:10:17
n°2224871
gilou
Modérateur
Modzilla
Posté le 11-04-2014 à 15:48:58  profilanswer
 

> Dans ma boucle d'export des datas, lorsque j'exporte la valeur de l'adresse IP consultée, le script me renvoie toutes les adresses du fichier TXT.  
 
printf($fichier "@servers" );
 
Quand on imprime une liste, ça imprime toutes les valeurs de la liste. Logique...
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2224872
clubber43
Posté le 11-04-2014 à 15:52:43  profilanswer
 

Et du coup poru imprimer l'adresse "en cours", il faut créer une boucle autre ?  
Ou c'est juste le printf($fichier "@servers" );  qui est pas bon ?
 
Parsque le @ signifie que je veux la liste en entiere du coup ?

n°2224876
gilou
Modérateur
Modzilla
Posté le 11-04-2014 à 16:05:07  profilanswer
 

Le @ signifie que @servers est une liste.
Et comme on a plus haut une boucle foreach (@servers)
La valeur en cours de l'IP est dans la variable $_  (tant qu'on est pas rentré dans une autre boucle).
Donc en remplaçant le printf($fichier "@servers" ); par un printf($fichier $_ ); ça devrait le faire.
 
A+,
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2225289
clubber43
Posté le 16-04-2014 à 21:29:05  profilanswer
 

Ok, c'est parfait;  
Et cela marche fort bien ^^
 
MErci pour le coup de main et désolé pour le retard, déplacement à l'étranger cette semaine.
 
@+

n°2226714
clubber43
Posté le 30-04-2014 à 09:29:26  profilanswer
 

Hello  :)  
 
Je retravaille (un peu) sur le script d'export et j'ameliiore encore un peu le travail . . .  
 
Je voudrais mettre en place l'archivage des données vers une BDD mysql dont je dispose de l'adresse IP, user et mot de passe.
Et-il possible de mettre en place la partie connexion et export vers BDD dans le script de départ? ou si je dois créer un autre script ?
 
Je posterais ce soir le bout de code de connexions pour voir si cela correspond bein à la logique.
 
Merci
 
@+

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  6  7

Aller à :
Ajouter une réponse
 

Sujets relatifs
Copier données en ligne par colonneComment génerer un fichier csv à partir d'une base de données?
perl + xml[Perl] Créer un graph RRD avec RRDTool::OO
[Résolu][Perl] XML::DOM Comment avoir une belle indentation?Programmation Java lecture base de données
[VBA-Excel] Comment appeler un fichier pour récupérer des données ?extraction de donnees
Récupération données d'un site PHPRécupérer des données d'un fichier xml
Plus de sujets relatifs à : [Résolu] Export données en perl


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR