2016-04-06 10 views
0

In dem Synopse von Text::CSV gibt es dieses BeispielText :: Csv-Modul in Perl, das Schreiben von Daten in einem CSV-

my @rows; 
my $csv = Text::CSV->new ({ binary => 1 }) # should set binary attribute. 
     or die "Cannot use CSV: ".Text::CSV->error_diag(); 

open my $fh, "<:encoding(utf8)", "test.csv" or die "test.csv: $!"; 

while (my $row = $csv->getline($fh)) { 
    $row->[2] =~ m/pattern/ or next; # 3rd field should match 
    push @rows, $row; 
} 

$csv->eof or $csv->error_diag(); 
close $fh; 

$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: $!"; 

Ich sehe, dass es einige Zeilen auf dem Array schiebt @rows, und dann die Array Zeile gedruckt wird nach Zeile innerhalb der Ausgabedatei.

Ich muss eine ähnliche Sache machen (wie nach einem Muster suchen und dann die Zeile speichern, um es in eine andere Datei später zu schreiben), aber ich brauche nur ein Feld aus jeder Zeile, und ich muss neue Felder zu $row hinzufügen das wurde geschoben. Wie würde ich das tun?

+0

Die Synopse verschiedene Anwendungsfallbeispiele enthält. Sie sollten den Rest der Dokumentation lesen. Um Ihre Frage klarer zu machen, bearbeiten Sie bitte die Beispieleingabe und die gewünschte Ausgabe. – simbabque

+2

Dann drücken Sie nur das Feld anstelle der ganzen Zeile wie 'push @rows, $ row -> [2]' und später schieben Sie auch andere neue Felder. –

+0

Brilliant, warum Sie dies nicht als Antwort hinzufügen, damit ich grün markieren kann? – BlueStarry

Antwort

1

Es ist schwierig, eine Lösung anzubieten, wenn Ihre Anforderung so vage ist, aber das allgemeine Prinzip ist, dass Sie statt $row auf das Array @rows einen Verweis auf ein Array mit den gewünschten Daten in die Ausgabe schieben sollten . Es ist bequem, ein anonymen Array für diese

Angenommen, Sie möchten die Ausgabe A, gefolgt von der dritten Spalte aus der Reihe, gefolgt von Z. Dann würden Sie die while Schleife ändern wie diese

Sie haben den Test zu ändern, um die Kontrolle zu machen, die Sie möchten

while (my $row = $csv->getline($fh)) { 
    next unless $row->[2] =~ /pattern/; 
    push @rows, [ 'A', $rows->[2], 'Z' ]; 
} 
+0

Ja, genau das habe ich gesucht. Vielen Dank – BlueStarry