perl POSIX :: strptime - mes données ressemblent à 9:31:00 - je veux extraire la minute et effectuer un calcul
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";
}
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