3

私は Perl の初心者で、現在、いくつかのタスクを自動化する Perl スクリプトに取り組んでいます。私が取り組んでいるスクリプトの 1 つは、システムからパフォーマンス データを抽出し、それを CSV ファイルに保存し、Excel グラフを生成することです。このスクリプトで数日間作業した後、抽出したデータを CSV に変換することができましたが、現在、データを転置するのに苦労しています! 私はこのスレッドを見てきました(スクリプトのdaltonに感謝します):stackoverflow thread、しかし私の場合は適用できないようです。

基本的に、私の CSV ファイルには、行ごとに毎日のデータが含まれており、列は 1 日の時間 (24 時間) です。

29-Aug-2013,3.68,3.63,3.75,3.65,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.70,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.63,3.83,3.67,2.92,2.34,3.21,3.45,3.51,3.57,3.46,3.52,4.19
31-Aug-2013,3.19,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,2.52,1.83,2.83,3.54,3.49,3.62,3.59,3.54,3.31
01-Sep-2013,2.88,3.16,2.79,2.90,3.78,3.18,3.26,2.84,3.21,2.50,3.35,3.78,3.30,4.04,3.80,3.07,3.23,3.54,3.30,3.43,3.56,3.48,3.60,3.78
02-Sep-2013,3.28,2.92,3.89,3.78,3.54,3.09,3.08,2.79,2.87,2.43,2.70,3.64,3.79,3.88,3.88,3.28,2.90,3.37,3.25,3.60,3.45,3.39,2.84,4.07
03-Sep-2013,3.31,2.54,3.59,3.59,3.50,3.10,2.98,2.63,3.20,2.53,2.92,3.42,3.76,3.07,3.41,2.42,2.12,3.19,3.32,3.08,3.63,3.50,3.71,3.75
04-Sep-2013,3.64,3.48,2.86,3.57,3.68,3.53,3.34,2.89,2.79,2.64,3.30,4.04,4.17,3.70,3.81,2.96,3.41,3.48,3.66,3.05,3.23,3.41,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.68,3.46,3.19,2.88,3.28,3.31,3.64
02:00,3.63,2.97,3.50,3.16,2.92,2.54,3.48
03:00,3.75,3.83,4.01,2.79,3.89,3.59,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";
}

私はすでにこれから結果を得ることさえできません!誰かがこれを行う方法についてのヒントを教えてもらえますか? 前もって感謝します!

4

2 に答える 2

3

1 つの単純な、しかし重大な間違いを犯しました。

split [ /,/ ] 

する必要があります

[ split /,/ ]

の構文splitは次のとおりです。

split /PATTERN/, EXPR, LIMIT

後者の 2 つはオプションです。あなたがしているのは、無名配列参照を として渡すことです。PATTERNこれは、文字列化されてARRAY(0x54d658). その結果、行は分割されず、行全体が配列にプッシュされます。後で、の逆参照が$rowエラーで失敗する原因となります

Can't use string ("29-Aug-2013,3.68,3.63,3.75,3.65,"...) as an ARRAY ref while "
strict refs" in use at foo.pl line 18, <F1> line 7.
于 2013-09-11T02:56:12.603 に答える