2013-09-11 47 views
2

我是一名Perl初學者,目前正在使用Perl腳本來自動執行一些任務。我正在處理的一個腳本涉及從系統中提取性能數據,將其存儲在CSV文件中並生成Excel圖形。在處理了這段腳本幾天之後,我設法將提取的數據轉換爲CSV格式,但是現在,我很難嘗試轉換數據!我已經看過這個帖子(感謝Dalton的腳本):stackoverflow thread,但我似乎無法將其應用於我的案例。在Perl中轉換CSV數據

基本上,我的CSV文件包含每行每天的數據,與列作爲一天的時間(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"; 
} 

我甚至無法從中得到結果!有人可以幫我提一些關於如何做到這一點的提示嗎?提前致謝!

+0

看起來你大多複製從http://stackoverflow.com/q/3249508/725418代碼。不過,你犯了一個嚴重的錯誤。 'split [/,/]'應該是'[split /,/]'。 – TLP

+0

TLP - 是的,這就是爲什麼我感謝我的帖子中的海報。我相信我在這裏試圖做的是逐行提取我的CSV文件,並將其用作數組數組。但是,我似乎無法將其放入新數組@rows中。我會嘗試你的建議並讓你知道。謝謝! –

+0

TLP - 就是這樣!它正在工作!非常感謝你的幫助! –

回答

3

你犯了一個簡單但嚴重的錯誤。

split [ /,/ ] 

應該

[ split /,/ ] 

的語法split

split /PATTERN/, EXPR, LIMIT 

其中後兩個是可選的。你正在做的是傳遞一個匿名數組參考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.