2014-01-06 4 views
1

CSV 파일 abc.csv을 읽어야하며, 몇 개의 필드를 선택하고 새 CSV 파일 def.csv을 작성해야합니다.Perl을 사용하여 CSV 파일의 빈 줄을 무시하십시오.

아래 코드는 제 코드입니다. abc.csv에서 빈 줄을 무시하려고합니다.

Use of uninitialized value $flops in pattern match (m//)

가 어떻게이 CSV에 빈 줄이 파일을 무시 않습니다

genNewCsv(); 

sub genNewCsv { 
    my $csv = Text::CSV->new(); 
    my $aCsv = "abc.csv" 
    my $mCsv = "def.csv"; 
    my $fh = FileHandle->new($aCsv, "r"); 
    my $nf = FileHandle->new($mCsv, "w"); 

    $csv->print($nf, [ "id", "flops""ub" ]); 
    while (my $row = $csv->getline($fh)) { 

     my $id = $row->[0]; 

     my $flops = $row->[2]; 
     next if ($id =~ /^\s+$/); #Ignore empty lines 

     my $ub = "TRUE"; 
     $csv->print($nf, [ $id, $flops, $ub ]); 
    } 
    $nf->close(); 
    $fh->close(); 
} 

는하지만 다음과 같은 오류가?

스택 오버플로 질문 Remove empty lines and space with Perl을 사용했지만 도움이되지 않았습니다. 당신은 당신이 오류가 발생했습니다 이유입니다, 플롭을 $ ID가 비어있는 경우 테스트가 아니라 $

unless(defined($id) && defined($flop) && defined($ub)){ 
    next; 
} 

: 모든 필드가 비어있는 경우

+0

fyi, "flops"와 "ub"사이에 쉼표가 누락 된 것 같습니다 – Gabs00

+0

줄이있는 경우 Cañons가 요소에 액세스하기 때문에 'next if ...'한 줄 위로 이동하십시오. – smartmeta

+0

@ Gabs00에 더 많은'syntax' 오류가 있습니다 :'my $ aCsv = "abc.csv"'는';'이 없습니다. 복사 - 붙여 넣기 실수? – chrsblck

답변

1

당신은 전체 행을 건너 뛸 수 있습니다.

당신은 또한

unless($id && $flop && $ub){ 
    next; 
} 

을 할 수 있어야, 빈 문자열은 false로 평가되는 것이다.

편집 : 이제 생각해 보았습니다. 거기에없는 줄을 무시하면 무엇을 의미합니까?

당신은 또한 할 수있는 첫 번째 값이 false로 평가 된 경우에서, 변수의 기본값을 보여줍니다

my $id = $row[0] || 'No Val' #Where no value is anything you want to signify it was empty 

이.

while (my $row = $csv->getline($fh)){ 
    next unless grep $_, @$row; 
    ... 
0

실행이 먼저 비어 있지 않은 라인

sub removeblanks { 
    my @lines =(); 
    while(@_) { 
     push @lines, $_ unless($_ =~ /^\s*$/); #add any other conditions here 
    } 
    return \@lines; 
} 
0

당신은 빈 줄을 건너 뛰려면 다음을 수행 할 수 있습니다 얻을 수 있습니다 필드가 정의되어 있습니다 :

use List::MoreUtils qw(any); 
while(my $row = ...) { 
    next unless any { defined } @{ $row }; 
    ... 
} 
관련 문제