2010-01-21 53 views
0

我有如下所示的樣品,其具有在第一列的時間戳CSV文件:如何根據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 ]; 

我需要幫助,瞭解如何從選定時間範圍的文件中過濾數據並創建一個數組。

回答

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

只是一個開始

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

請注意,上面的代碼只適用於.cvs中的行按時間排序,這似乎是真的,但是誰知道。 – 2010-01-21 13:23:41

+0

是的,但它不適用於時間戳。當我只給出「^小時」的時間時,它的工作。僅指數字,不指時間戳。 – Space 2010-01-21 13:31:48

+2

如果在那些時候沒有日誌條目,這是行不通的,雖然不錯。 – 2010-01-21 13:32:50

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. 
} 
相關問題