2013-10-02 2 views
2

화면에 잘 인쇄되는 펄 스크립트가 있습니다. 그러나 출력을 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으로 밀어 넣는 방식으로, 거대한 평평한 배열을 얻을 수 있습니다. 아마 당신이 원하는 것이 아닙니다.

는 다음과 같은 고려 : [a,b,c,d,e,f] :

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

우리에게 평면 배열을 제공합니다.

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

우리에게 중첩 된 배열을 제공합니다 :이

[[a,b,c], [d,e,f]].

배열과 배열 참조도 비슷하지만 다르다. perlreftut을 참조하십시오. 이는 미묘한 개념이지만 고급 Perl 개발에는 결정적입니다. 그것을 읽고 이해하십시오!

귀하의 푸시 코드는 다음과 같은 것을 볼 수 있었다 : 그 스칼라 주위

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

[]는 익명의 배열 참조를 작성합니다. @rows에는 이제 배열 참조가 채워 지므로 다른 것을 변경할 필요가 없습니다.

+1

이것은 완벽하게 작동했습니다. 감사! – Craig

1

이 다음에 오류보고 라인을 변경해보십시오 수 있습니다 :

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

인용 한 print 기능의 CPAN 문서 Text::CSV_XS에서

그것을 배열을 입력으로 간주합니다 (배열이 아님)

+0

같은 결과로이 작업을 시도했습니다. – Craig

관련 문제