2014-01-06 23 views
1

我必須讀取CSV文件abc.csv,從中選擇幾個字段並形成一個新的CSV文件def.csv忽略使用Perl的CSV文件中的空行

以下是我的代碼。我試圖忽略來自abc.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(); 
} 

,但我得到了以下錯誤:

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

我怎麼忽略空行的CSV文件?

我已經使用堆棧溢出問題Remove empty lines and space with Perl,但它沒有幫助。

+0

fyi,你似乎在「flops」和「ub」之間缺少一個逗號 – Gabs00

+0

將'next if ...'移動一行,因爲如果行是Cañons訪問元素。 – smartmeta

+0

添加到@ Gabs00中,您有更多'syntax'錯誤:'my $ aCsv =「abc.csv」'缺少';'。複製粘貼錯誤? – chrsblck

回答

1

可以跳過整行,如果任何字段爲空:

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

你測試過,如果$ ID是空的,但不是$響聲,這就是爲什麼你得到了錯誤。

你也應該能夠做到

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

在那裏,一個空字符串將評估爲false。

編輯:現在我想到了,你的意思是忽略那些不在那裏的線?

你也可以做到這一點

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

這將顯示一個默認值的變量,如果第一個值結果爲假。

0

運行這對您的文件第一次獲得非空行

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

你可以做以下跳過空行:

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

你可以使用List::MoreUtils來檢查是否有任何的字段的定義如下:

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