我想读取一个csv文件。 csv文件如下所示,
If something:
If something_else:
#actions
对于以上的csv,我想在#start和#stop之间阅读。另外,我想区分两个#start_loop,例如,从第一个#start_loop到第一个数组的行和另一个#start_loop到另一个数组的行。
预期结果将是:
cat,dog,0
apple,banana,0
#start_loop
jug,ball,0
tub, jar,3
#stop_loop
phone,bottle,10
#per head
#start_loop
cup,book,7
laptop,charger,9
#stop_loop
和
@array1 = {jug ball 0, tub jar 3}
如何解决此问题?
答案 0 :(得分:4)
您可以使用触发器运算符。 #start行的值为1,#stop行的值为E。
#!/usr/bin/perl
use warnings;
use strict;
my @arr;
while (<>) {
chomp;
my $inside = /^#start_loop/ .. /^#stop_loop/;
if ($inside) {
push @arr, [] if 1 == $inside;
undef $inside if 1 == $inside
|| $inside =~ /E/;
push @{ $arr[-1] }, $_ if $inside;
}
}
use Data::Dumper; print Dumper \@arr;
答案 1 :(得分:3)
choroba解决方案的简化版本:
my @arr;
while (<>) {
chomp;
my $inside = /^#start_loop/ .. /^#stop_loop/;
if ( $inside == 1 ) { push @arr, []; } # Start line
elsif ( $inside !~ /E/ ) { push @{ $arr[-1] }, $_; } # Middle line
}
没有触发器:
my @arr;
my $inside;
while (<>) {
chomp;
if ( /^#start_loop/ ) { $inside = 1; push @arr, []; } # Start line
elsif ( /^#stop_loop/ ) { $inside = 0; } # Stop line
elsif ( $inside ) { push @{ $arr[-1] }, $_; } # Middle line
}