在Perl中转置CSV数据

前端之家收集整理的这篇文章主要介绍了在Perl中转置CSV数据前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是一名Perl初学者,目前正致力于Perl脚本以自动完成我们的一些任务.我正在处理的一个脚本涉及从我们的系统中提取性能数据,将其存储在CSV文件中并生成Excel图形.在处理完这个脚本几天之后,我已经设法将提取的数据转换成CSV,但是现在,我很难设法转换数据!我已经看过这个帖子(感谢dalton的脚本): stackoverflow thread,但我似乎无法在我的情况下应用它.

基本上,我的CSV文件包含每行的每日数据,列数为一天中的小时数(24小时):

29-Aug-2013,3.68,3.63,3.75,3.65,3.11,3.34,2.74,2.83,2.52,3.19,4.24,3.84,3.61,3.69,2.96,2.76,2.91,3.70,3.82,3.54,2.54,3.90
30-Aug-2013,3.46,2.97,3.83,3.55,3.41,3.47,3.32,2.81,2.80,2.32,3.17,3.60,3.67,2.92,2.34,3.21,3.45,3.51,3.57,3.52,4.19
31-Aug-2013,3.50,4.01,3.91,3.71,3.33,3.20,2.95,2.90,2.37,3.07,3.48,2.86,3.29,3.22,1.83,3.49,3.62,3.59,3.31
01-Sep-2013,2.88,3.16,2.79,3.78,3.18,3.26,2.84,2.50,3.35,3.30,4.04,3.80,3.23,3.43,3.56,3.78
02-Sep-2013,3.28,3.89,3.09,3.08,2.87,2.43,2.70,3.64,3.79,3.88,3.37,3.25,3.39,4.07
03-Sep-2013,3.31,3.10,2.98,2.63,2.53,3.42,3.76,2.42,2.12,3.75
04-Sep-2013,3.53,2.89,2.64,4.17,3.81,3.66,3.05,3.15,4.31

现在,我想转置它,以便我将写入新CSV文件的结果数据如下所示:

Time,29-Aug-2013,30-Aug-2013,1-Sep-2013,2-Sep-2013,3-Sep-2013,4-Sep-2013
01:00,3.64
02:00,3.48
03:00,2.86
...

现在,我的脚本看起来像这样:

my @rows = ();
my @transposed = ();

open F1,"D:\\Temp\\perf_data.csv";
while(<F1>) {
    chomp;
    push @rows,split [ /,/ ];
}
#print @rows;

for my $row (@rows) {
  for my $column (0 .. $#{$row}) {
    push(@{$transposed[$column]},$row->[$column]);
  }
}

for my $new_row (@transposed) {
  for my $new_col (@{$new_row}) {
      print $new_col,",";
  }
  print "\n";
}

我甚至不能从中得到结果!有人可以帮我一些关于如何做到这一点的提示吗?提前致谢!

解决方法

你犯了一个简单而又严重的错误.
split [ /,/ ]

应该

[ split /,/ ]

拆分的语法是

split /PATTERN/,EXPR,LIMIT

后两者是可选的.你正在做的是将一个匿名数组ref作为PATTERN传递,它很可能被字符串化为类似ARRAY(0x54d658)的东西.结果是线未分割,整条线被推到阵列上.稍后,这将导致$row的解除引用失败并显示错误

Can't use string ("29-Aug-2013,"...) as an ARRAY ref while "
strict refs" in use at foo.pl line 18,<F1> line 7.

猜你在找的Perl相关文章