我正在尝试从时间03:00:00
中选择值,并从第3列(89)中减去第6列(4.86)。 (这是基于第二列,时间。)结果值我需要通过附加字母i
作为前缀变成变量名:
2015-03-17,00:00:00,68,1003.08,7.85,7.853,
2015-03-17,03:00:00,89,1003.1,4.857,4.86,
2015-03-17,06:00:00,96,1000.74,3.78,3.782,
2015-03-17,09:00:00,95,999.48,3.2,3.2,
2015-03-17,12:00:00,95,1001.42,2.02,2.024,
2015-03-17,15:00:00,86,1005.77,0.49700000000001,0.5,
2015-03-17,18:00:00,75,1008.88,-0.13,-0.12899999999996,
2015-03-17,21:00:00,72,1010.85,-0.12199999999996,-0.12,
e.g。从第二列中的03:00:00
行开始,计算ROUNDED(col3 - col6)
(84)然后计算CONCAT('i', value)
(如果这是MySQL)
@subvalue
将为i84
我有什么:
use strict;
use warnings;
use Text::CSV;
my $csv = Text::CSV_XS->new ({ binary => 1, auto_diag => 1 });
my $in_file = 'file.csv';
open my $fh, '<', $in_file or die "could not open $in_file: $!\n";
my @column = map { $_->[2] } @{ $csv->getline_all($fh) };
print @column;
}
这显然只提取一列。对于附加,我正在考虑使用join或甚至系统(“粘贴-d,因为它在Linux中)
答案 0 :(得分:1)
这就是我认为你的意思,<罢工>但我不知道你是如何从你的数据中获得i84
。
至于&#34;结果值我需要变成一个变量&#34; 我认为你的意思是创建一个像 这样的变量$i995
i84
,但你不能说出你想用它做什么,你最好将该字符串用作哈希键。
use strict;
use warnings;
my $in_file = 'tortest.csv';
open my $fh, '<', $in_file or die qq{Unable to open "$in_file" for input: $!};
while ( <$fh> ) {
chomp;
my @fields = split /,/;
printf "i%.0f\n", $fields[2] - $fields[5];
}
<强>输出强>
i60
i84
i92
i92
i93
i86
i75
i72
<强>更新强>
如果您更喜欢使用map
,那么就可以这样做。
use strict;
use warnings;
my $in_file = 'tortest.csv';
open my $fh, '<', $in_file or die qq{Unable to open "$in_file" for input: $!};
my @values = map {
chomp;
my @fields = split /,/;
sprintf "i%.0f", $fields[2] - $fields[5];
} <$fh>;
print "$_\n" for @values;
输出与上述程序的输出相同。