2014-01-06 2 views
1

Мне нужно прочитать CSV-файл, abc.csv, выбрать несколько полей из них и сформировать новый CSV-файл, def.csv.Игнорировать пустые строки в CSV-файле с использованием Perl

Ниже приведен мой код. Я пытаюсь игнорировать пустые строки от 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 файл?

Я использовал Stack Overflow вопрос Remove empty lines and space with Perl, но это не помогло.

+0

У вас, кажется, отсутствует запятая между «flops» и «ub» – Gabs00

+0

Переместите «next if ...» в одну строку, потому что вы получаете доступ к элементам Canñons, если линия. – smartmeta

+0

Добавляя к @ Gabs00, у вас больше ошибок синтаксиса: 'my $ aCsv =" abc.csv "' отсутствует ';'. Ошибка копирования-вставки? – chrsblck

ответ

1

Вы можете пропустить всю строку, если какие-либо поля пусты:

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

Вы испытаны, если $ ID был пуст, но не $ провалов, поэтому вы получили ошибку.

Вы также должны быть в состоянии сделать

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

Там, пустая строка будет оценивать ложь.

Редактировать: Теперь, когда я думаю об этом, что вы имеете в виду, игнорируя строки, которых нет?

Вы также можете сделать это

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 }; 
    ... 
} 
Смежные вопросы