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

  FORUM HardWare.fr
  Programmation
  Perl

  help programmation perl

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

help programmation perl

n°2231880
maniak57
Posté le 26-06-2014 à 15:23:59  profilanswer
 

Bonjour, Alors voila je programme en perl depuis peu, je suis loin de tous savoir, et j'ai besoin d'aide svp
 
Alors j'ai un .csv qui me retourne les erreurs avec le temps etc.. et je voudrais ecrire un perl qui me permettrait de chopper le temps du numéro d'erreur de mon csv, mais attention l'erreur (ex: 1020 ) doit dabord cumuler le tps total de sont erreur sur une année ( 525600 minute dans une année) et ensuite faire le calcule ( temps total de l'erreur * 100 divisé par le temps d'une année ) tous cela ecrit en perl et qui renvoie donc le pourcentage du temps de l'erreur dans un autre csv. je sais pas si j'ai bien expliquer mon soucis et ce que je recherche, donc si vous voulez plus de detail dite le moi :3
 
Merci d'avance ;)

mood
Publicité
Posté le 26-06-2014 à 15:23:59  profilanswer
 

n°2232000
gilou
Modérateur
Modzilla
Posté le 27-06-2014 à 13:53:02  profilanswer
 

Bonjour, oui, je voudrais plus de déails, car c'est loin d'être clair pour le moment.
Une ou deux lignes du CSV et ce que vous voulez en faire serait pas mal non plus pour aider à avancer :)
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2232010
maniak57
Posté le 27-06-2014 à 14:19:20  profilanswer
 

Alors en fais j'ai un csv ou j'ai le retour des erreurs d'un programme.
dans ce csv, il y a le numéro d'erreur par exemple (1020) l'heure et la date de quand cela c'est produit et aussi le temps, le temps reste le même pour l'instant, c'est 600 seconde sois 10 minute.
Mtn ce que je veut faire c'est récuperer a l'aide d'un programme perl le temps de cet erreur pour calculer le taux d'indisponibilité du programme sois faire le calcule (10/525600)*100. ce qui me donnera le pourcentage .
mais le soucis c'est qu'en perl je galère encore Mdrr et justement je voulais de l'aide sur la programmation, me faudrais au mieux un programme exemple, avec juste les chemin a remplacer. A oui j'ai oublier de préciser, le pourcentage que je recoit a la fin, il faut qu'il sois écrit dans un autre csv oui il n'y a que dans une case la valeur en % Merci de votre aide :)

n°2232014
gilou
Modérateur
Modzilla
Posté le 27-06-2014 à 14:23:16  profilanswer
 

Comme je vous ai déja dit, donnez une ou deux lignes exemples de votre CSV source en détaillant le ou les champs utiles pour la suite.
Et donnez aussi une ligne exemple du CSV résultat que vous voulez obtenir.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2232133
maniak57
Posté le 30-06-2014 à 08:49:20  profilanswer
 

Voici un exemple:
 
140627-0811;1025;erreur retour autoscript;600
140626-1348;1025;erreur retour autoscript;600
 
Voila sa c'est ce que je reçoit dans mon csv,
 
Mtn je veut récupérer le 600 qui représente les second.
pour arrivé a un résultat :
 
1025; ...% d'indisponibilité ( les 3 petit points est le résultat de 600/31536000*100 )
 
1025 est donc le numéro d'erreur et le pourcentage c'est le taux d'indisponibilité. Voila je vous ai tous dit Merci d'avance :)

n°2232169
gilou
Modérateur
Modzilla
Posté le 30-06-2014 à 12:16:05  profilanswer
 

Ceci devrait vous donner un bon point de départ:

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. my ($fh, %data);
  7. open $fh, "<", 'log.txt';
  8. while (<$fh> ) {
  9.    if (/^\d+-\d+;(\d+);[^;]*;(\d+)\s*$/) {
  10.     $data{$1} += $2;
  11.    }
  12. }
  13. close $fh;
  14.  
  15. open $fh, ">", 'result.txt';
  16. foreach (sort(keys %data)) {
  17.    print $fh $_, "; ", $data{$_}*100/31536000, "% d'indisponibilite\n";
  18. }
  19. close $fh;


 
1) on lit le log ligne a ligne et on parse avec une expression régulière pour ne garder que les deux champs concernés de la ligne
2) on remplit un hash dont les clés sont les numéros d'erreur et les valeurs le temps cumulé pour chaque erreur
3) on écrit dans un fichier résultat chaque clé (donc numéro d'erreur) et valeur associée a la clé (donc temps cumulé pour le numéro d'erreur) modulo une formule appropriée
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2232179
maniak57
Posté le 30-06-2014 à 13:24:33  profilanswer
 

Merci votre code est compréhensible, il ma beaucoup aidé mais lorsque le fichier de résultat se crée malheureusement il n'y a rien d'écrit, mes chemin sont correcte mais il n'arrive pas a lire les lignes.
Questions:
Est ce obliger que le fichier d'ouverture sois un .txt et non pas un .csv ?
Est-ce que la ligne :  
 
print $fh $_, "; ", $data{$_}*100/31536000, "% d'indisponibilite\n";
 
doit être complété par une valeur qui précise après quel ";" il doit lire ?
 
Merci d'avance,

n°2232191
gilou
Modérateur
Modzilla
Posté le 30-06-2014 à 15:05:32  profilanswer
 

>> Est ce obliger que le fichier d'ouverture sois un .txt et non pas un .csv ?
Non, ça peut être n'importe quoi. C'est juste un nom de fichier.

 

>> mes chemin sont correcte
Quels chemins? donnez les ici en exemple

 

>> il n'arrive pas a lire les lignes
?? vous avez un message d'erreur en console?

 


>> doit être complété par une valeur qui précise après quel ";" il doit lire ?
La ligne est avec un print $fh, c'est donc une ligne d'écriture (dans le fichier ouvert associé au handle $fh)

 

La lecture ligne a ligne est faite dans la boucle  while (<$fh> ) { ... }
On lit ligne a ligne le fichier ouvert associé au handle $fh, on met le contenu de la ligne dans la variable implicite $_ et on exécute le bloc de code de la boucle.
Le match d'expression régulière /^\d+-\d+;(\d+);[^;]*;(\d+)\s*$/ du test s’exécute par défaut sur la variable $_, donc sur la ligne lue.

 

A+,


Message édité par gilou le 30-06-2014 à 15:07:40

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2232201
maniak57
Posté le 30-06-2014 à 15:28:49  profilanswer
 

Voici le code avec les chemin :
 
#!/usr/bin/perl
 
use strict;
use warnings;
use autodie;
 
my ($fh, %data);
open $fh, "<", 'C:\Admin\TUN\res\inftund_au3_ret.txt';
while (<$fh> ) {
    if (/^\d+-\d+;(\d+);[^;]*;(\d+)\s*$/) {
    $data{$1} += $2;
    }
}
close $fh;
 
open $fh, ">", 'C:\Admin\TUN\res\inftund_retour_dispo.txt';
foreach (sort(keys %data)) {
    print $fh $_, ";", $data{$_}*100/31536000, "% d'indisponibilite\n";
}
close $fh;
 
- Dans la console il n'affiche pas d'erreur, seulement la pause que j'indique dans le .bat et ensuite le message "Appuyez sur une touche pour continuer..."
 
Le fichier se crée correctement mais rien n'est écrit.

n°2232217
gilou
Modérateur
Modzilla
Posté le 30-06-2014 à 17:01:12  profilanswer
 

C'est bien des lignes comme
140627-0811;1025;erreur retour autoscript;600  
que vous avez dans le fichier source, avec ce nombre exact de champs? et sans blanc en début de ligne?
Parce que chez moi, l'expression régulière initiale matche cette ligne sans pb.
 
Au vu du symptôme, on dirait que l'expression régulière n'est matchée par aucune ligne (donc %data reste vide, et le code d'écriture ne fait que créer un fichier vide).
Pour vérifier , changez
my ($fh, %data);  
par
my ($fh, %data);  
my $cnt = 0;
et changez
    if (/^\d+-\d+;(\d+);[^;]*;(\d+)\s*$/) {
        $data{$1} += $2;
    }  
par
    if (/^\d+-\d+;(\d+);[^;]*;(\d+)\s*$/) {
        $data{$1} += $2;
    }  
    else {
        ++$cnt;
        if ($cnt <= 10) {
            print "Unmatched: $_\n";
        }
    }
Ça va écrire a la console les 10 premières lignes pas matchées par l'expression régulière (alors qu'elles devraient l'être)
 
L'expression régulière est:
^\d+-\d+;(\d+);[^;]*;(\d+)\s*$
^ début de ligne
\d+ des chiffres
- un tiret
\d+ des chiffres
; un point virgule
(\d+)  des chiffres, qu'on stocke dans un premier groupe, $1
; un point virgule
[^;]* des caractères autres qu'un point virgule
; un point virgule
(\d+)  des chiffres, qu'on stocke dans un premier groupe, $2
\s* des espaces éventuels
$ fin de ligne
 
S'il y a des espaces autour des champs, on peut utiliser l'expression
^\s*\d+-\d+\s*;\s*(\d+)\s*;[^;]*;\s*(\d+)\s*$
qui suppose qu'il peut y avoir des blancs en début de début et fin de ligne, ou autour des ; séparateurs de champs
 
 
A+,


Message édité par gilou le 30-06-2014 à 17:21:50

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
mood
Publicité
Posté le 30-06-2014 à 17:01:12  profilanswer
 

n°2232275
maniak57
Posté le 01-07-2014 à 08:38:35  profilanswer
 

Merci sa fonctionne, effectivement le %data crée un fichier vide cela etais le soucis.
Merci encore :hello:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  help programmation perl

 

Sujets relatifs
[RESOLU][PERL] Extraire chaines multiples dans une fichieraide pour un projet en programmation c++
help igor[HELP ] Explication d'un Programme
Problème ProgrammationApprendre la programmation
Help pour un programme javaProgrammation objet : aiguillage automatique.
Compétition de Programmation Robotique Maker Faire Paris 
Plus de sujets relatifs à : help programmation perl


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