perl POSIX :: strptime - mes données ressemblent à 9:31:00 - je veux extraire la minute et effectuer un calcul

StackOverflow https://stackoverflow.com/questions/5412603

Question

Je souhaite extraire la minute d'une heure spécifiée qui existe dans la 2ème colonne d'un fichier délimité par des virgules et effectuer un calcul.Le format de l'heure est le suivant:

9:31:00

Je souhaite extraire la valeur des minutes et calculer le nombre total de minutes de la journée jusqu'à présent.Je fais cela dans le sous-programme get_time.Mais la valeur retournée est toujours zéro, ce qui me fait penser que je n'utilise pas correctement POSIX :: strptime.Toute idée serait merveilleuse.Merci.

#!/usr/bin/env perl  
use strict;  
use POSIX::strptime;  
use Text::CSV;  

sub get_time  
{  
    my($str) = @_;
    my ($sec, $min, $hour) = (POSIX::strptime($str, '%I:%M:%S')) [3,4,5];
    print "$hour\n";
    return($hour*60 + $min)
}

open my $fh, "<", datafile.txt
my $csv = Text::CSV->new() or die "Failed to create Text::CSV object";
my $line = <$fh>;

die "Failed to parse line <<$line>>\n\n" unless $csv->parse($line);
my @columns = $csv->fields();

while ($line = <$fh>)
{
   chomp $line;
   die "Failed to parse line <<$line>>\n\n" unless $csv->parse($line);
   my @columns = $csv->fields();
   die "Insufficient columns in <<$line>>\n" if scalar(@columns) < 1;
   my $minute = get_time($columns[1]);
   print "$minute\n";
}
Était-ce utile?

La solution

Dans get_time, vous avez la ligne

my ($sec, $min, $hour) = (POSIX::strptime($str, '%I:%M:%S')) [3,4,5];`

Selon les docs , strptime renvoie

($sec, $min, $hour, $mday, $mon, $year, $wday, $yday) = POSIX::strptime("string", "Format");

Il semble donc que vous ayez besoin

my ($sec, $min, $hour) = (POSIX::strptime($str, '%I:%M:%S')) [0,1,2];

à la place.

Bonne chance!

Autres conseils

Il est impossible de déterminer correctement le nombre de minutes dans une journée avant une certaine heure sans connaître le fuseau horaire et éventuellement la date.

$ perl -MDateTime -E'
   for (10..16) {
      my $dt = DateTime->new(
         year      => 2011,
         month     => 3,
         day       => $_,
         hour      => 9,
         minute    => 31,
         second    => 0,
         time_zone => "America/New_York",
      );
      ( my $ref_dt = $dt->clone )->truncate(to => "day");
      my $minutes = ($dt - $ref_dt)->in_units("minutes");
      say($dt->ymd, " ",  $minutes);
   }
'
2011-03-10 571
2011-03-11 571
2011-03-12 571
2011-03-13 511    <------
2011-03-14 571
2011-03-15 571
2011-03-16 571
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top