如何根据Perl中的时间戳从CSV文件中选择记录?

时间:2010-01-21 13:08:52

标签: perl

我的CSV文件在第一列中有时间戳,如下所示示例:

Time,head1,head2,...head3
00:00:00,24,22,...,n
00:00:01,34,55,...,n
and so on...

我想过滤出具有特定时间范围的数据,例如从11:00:00到16:00:00使用标题并放入数组。我编写了下面的代码来获取数组中的标题。

#!/usr/bin/perl -w
use strict;

my $start = $ARGV[0];
my $end = $ARGV[1];

my $line;
$line =<STDIN>;
my $header = [ split /[,\n]/, $line ];

我需要有关如何从具有所选时间范围的文件过滤数据的帮助,并创建一个数组。

3 个答案:

答案 0 :(得分:2)

我有点被骗了。一个正确的程序可能会使用DateTime,然后与DateTime的比较函数进行比较。如果你只是期望以这种格式输入,我的“作弊”应该有用。

#!/usr/bin/perl
use strict;
use warnings;

use Text::CSV;
use DateTime;

my $start = 110000;
my $end   = 160000;

my $csv = Text::CSV->new () or die "Cannot use CSV: ".Text::CSV->error_diag ();

my @lines;
open my $fh, "<:encoding(utf8)", "file.csv" or die "Error opening file: $!";
while ( my $row = $csv->getline( $fh ) ) {
    my $time = $row->[0];
    $time =~ s/\://g;
    if ($time >= $start and $time <= $end) {
        push @lines, $row;
    }
}
$csv->eof or $csv->error_diag();
close $fh;

#do something here with @lines

答案 1 :(得分:1)

只是一个开始

my $start="01:00:01";
my $end = "11:00:01";
while(<>){
    chomp;
    if ( /$start/../$end/ ){
        @s = split /,/ ;
        # do what you want with @s here.
    }
}

答案 2 :(得分:1)

#!/usr/bin/perl -w
use strict;

my $start = '11:00:00';
my $end = '16:00:00';

my @data;
chomp ($_ = <STDIN>);    # remove trailing newline character
push @data, [split /,/]; # add header

while(<>) {
    chomp;
    my @line = split /,/; 
    next if $line[0] lt $start or $line[0] gt $end;
    push @data, [@line]; # $data[i][j] contains j-th element of i-th line.
}