2013-10-02 122 views
2

我有一個perl腳本,它可以很好地打印到屏幕上,但是當我嘗試將輸出重定向到csv文件時,出現以下錯誤:Expected fields to an array ref。我使用Text::CSV_XS,並且給出了錯誤的行是$csv->print ($fh, $_) for @rows;使用Text :: CSV_XS輸出到csv文件

#!/user/local/bin/perl 
use Text::CSV_XS; 
$|=1; 

sub main { 
    print "Enter file to process: "; 
    my $file = <STDIN>; 
    chomp $file; 

    my @rows; 
    my $csv = Text::CSV_XS->new ({ binary => 1, auto_diag => 1 }); 
    open(INPUT, $file) or die("Input file $file not found.\n"); 
    while(my $line = <INPUT>) { 
     if($line =~ /Assay/) { 
      @words = split(" ",$line); 
      push @rows, $words[1]; 
     } 
     if($line =~/Date/) { 
      @words = split(" ",$line); 
      push @rows, $words[1]; 
      push @rows, $words[2]; 
     } 
     if($line =~/Patient/) { 
      @words = split(" ",$line); 
      push @rows, $words[0]; 
      push @rows, $words[1]; 
      push @rows, $words[2]; 
     } 
     if($line =~/channel_index/) { 
      print $line; 
     } 

     if($line =~/Channel/) { 
      @words = split(" ",$line); 
      push @rows, $words[1]; 
      push @rows, $words[2]; 
     } 
     if($line =~/DCMean/) { 
      @words = split(" ",$line); 
      push @rows, $words[0]; 
      push @rows, $words[1]; 
     } 
    } 

    $csv->eol ("\r\n"); 
    open $fh, ">:encoding(utf8)", "new.csv" or die "new.csv: $!"; 
    $csv->print ($fh, $_) for @rows; 
    close $fh or die "new.csv: $!"; 
    close(INPUT); 
} 

main(); 

回答

4

您將值推向@rows的方式,您只會得到一個龐大而平坦的標量數組。這可能不是你想要的。

考慮以下幾點:

my @rows; 
push @rows, 'a'; 
push @rows, 'b'; 
push @rows, 'c'; 
push @rows, 'd'; 
push @rows, 'e'; 
push @rows, 'f'; 

給我們一個扁平陣列:[a,b,c,d,e,f]

凡本:

my @rows; 
push @rows, ['a', 'b', 'c']; 
push @rows, ['d', 'e', 'f']; 

給了我們一個嵌套的數組:[[a,b,c], [d,e,f]]

它也發生陣列和arrayrefs是相似的,但不同。請參閱perlreftut。這是一個微妙的概念,但對於高級Perl開發至關重要。請閱讀並理解它!

你推的代碼可能是這個樣子:

push @rows, [$words[1], $words[2]]; 

[]圍繞這些標量創建一個匿名數組引用。由於@rows現在將填充數組參考,您不需要更改其他任何東西。

+1

這工作完美。謝謝! – Craig

1

嘗試更改錯誤報告線以下:

$csv->print ($fh, \@rows); 

引自Text::CSV_XSprint功能的CPAN文檔

它期望陣列參考作爲輸入(不是陣列!)

+0

我試着用相同的結果做這個。 – Craig