Perl POSIX :: strptime - мои данные выглядят как 9:31:00 AM - я хочу извлечь минуту и ​​выполнить расчет - PullRequest
0 голосов
/ 24 марта 2011

Я хочу извлечь минуты из указанного времени, которое существует во 2-м столбце файла с разделителями-запятыми, и выполнить расчет.Формат времени выглядит следующим образом:

9: 31: 00 AM

Я хочу извлечь значение минут и рассчитать общее количество минут за день.Я делаю это в подпрограмме get_time.Но возвращаемое значение всегда равно нулю, что заставляет меня думать, что я не использую POSIX :: strptime правильно.Любое понимание было бы замечательно.Спасибо.

#!/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";
}

Ответы [ 2 ]

2 голосов
/ 24 марта 2011

В get_time у вас есть строка

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

Согласно документам , strptime возвращает

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

Так что, похоже, вам нужно

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

.

Удачи!

0 голосов
/ 24 марта 2011

Невозможно правильно определить количество минут в дне до определенного времени, не зная часовой пояс и, возможно, дату.

$ 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
...