IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

additionner les valeurs toutes les 4 lignes


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 26
    Points : 16
    Points
    16
    Par défaut additionner les valeurs toutes les 4 lignes
    Bonjour,

    J'aimerai faire un traitement sur un fichier en PERL mais j'ai quelques difficultés.
    Mon fichier est de la forme :
    jjmmaaaa hh:mm Valeur
    (On y retrouve des valeurs sur 1 semaine, chaque 1/4 d'heure)

    Mon objectif est de sommer les valeurs des 1/4 heures pour avoir la valeur à l'heure.

    Exemple :

    23122009 00:00 150
    23122009 00:15 250
    23122009 00:30 350
    23122009 00:45 450
    24122009 00:00 5000
    24122009 00:15 6000
    24122009 00:30 4000
    24122009 00:45 5000

    Je souhaiterai obtenir ==> 23122009 00:00 1200
    24122009 00:00 20000

    Voilà ce que j'ai fait pour chaque heure
    if ($hour =="00" ) {
    $Valeur+=$val[2];
    }

    J'ai un programme immense et j'aimerais l'optimiser. Est ce que quelqu'un a une meilleure solution svp ??
    J'avoue que je ne sais pas comment m'y prendre.

    Merci d'avance aux personnes qui pourront m'éclairer.

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #!/usr/bin/env perl
    use strict; use warnings;
    use v5.10;
     
    my $filename = shift;
    open my($file), '<', $filename
      or die "Can't open $filename : $!\n";
     
    my $accum = 0;
     
    while(<$file>) {
      my($date, $hour, $min, $val) =  m/^(\d{8}) (\d{2}):(\d{2}) (\d+)/;
      $accum += $val;
      if ($min == 45) {
        say "$date $hour:00 $accum";
        $accum = 0;
      }
    }
     
    close $file;
     
    __END__
    Note que si la lisibilité de ton code t'importe peu, ce peut être fait en une ligne de commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -nE '/^(\d{8}) (\d{2}):(\d{2}) (\d+)/;$acc+=$4;if($3==45){say"$1 $2:00 $acc";$acc=0}' fichier >fichierRésultat
    --
    Jedaï

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 26
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par Jedai Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #!/usr/bin/env perl
    use strict; use warnings;
    use v5.10;
     
    my $filename = shift;
    open my($file), '<', $filename
      or die "Can't open $filename : $!\n";
     
    my $accum = 0;
     
    while(<$file>) {
      my($date, $hour, $min, $val) =  m/^(\d{8}) (\d{2}):(\d{2}) (\d+)/;
      $accum += $val;
      if ($min == 45) {
        say "$date $hour:00 $accum";
        $accum = 0;
      }
    }
     
    close $file;
     
    __END__
    Note que si la lisibilité de ton code t'importe peu, ce peut être fait en une ligne de commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -nE '/^(\d{8}) (\d{2}):(\d{2}) (\d+)/;$acc+=$4;if($3==45){say"$1 $2:00 $acc";$acc=0}' fichier >fichierRésultat
    --
    Jedaï

    Merci Jedaï

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 13/03/2015, 10h54
  2. [CR XI] Effectuer un filtre de toutes les valeurs sauf les champs non renseignés
    Par alicaime dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 08/06/2014, 22h04
  3. PROC TABULATE : Mettre en couleur toutes les valeurs d'une ligne total
    Par CHmartine dans le forum ODS et reporting
    Réponses: 1
    Dernier message: 04/10/2011, 16h58
  4. Réponses: 5
    Dernier message: 10/07/2008, 13h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo