使用Perl从两个CSV列之间的差异创建变量名称

时间:2015-03-21 15:19:38

标签: perl

我正在尝试从时间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中)

1 个答案:

答案 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;

输出与上述程序的输出相同。