2012-03-29 1 views
0

Ich bin neu in Perl. Dies ist ein Beispiel für einen csv-Eintrag, der meinem ähnelt. Ich möchte das analysieren, versuchte kurz Text :: CSV, aber kein Glück. Das Problem hier ist Newline und Kommas innerhalb Felder. Wie kann ich diese Datei in Perl analysieren? Danke für die Hilfe.Wie CSVs mit Newline und Kommas in einem Feld in Perl analysieren?

1,A,"Length of x, where x is y" 
2,B,"Set A to “10”, an invalid state" 
3,C,"Solve 
A+B and 
B+A 
" 
4,D, Set C to B 
+6

der Show. Code, den Sie versucht haben. Es kann wahrscheinlich gemacht werden, um zu arbeiten Text :: CSV ist ein gutes Modul – Cfreak

+0

Der beste Hinweis ist ... Versuchen Sie nicht, CSV selbst zu analysieren. Warum glaubst du, dass 'Text :: CSV' nicht funktioniert hat? – dgw

+0

Sorry, dass die Post, ich die Lösung herausgefunden. Ich habe es gepostet. Anfangs habe ich versucht, mich selbst zu parsen, aber später schaute ich in Text :: CSV, aber das Problem lag an der Option, die ich nicht einschloss. Sorry und Danke. – Vikyboss

Antwort

7

Dieser Code (direkt vom Text genommen :: CSV-Dokumentation).

#!/usr/bin/perl 

use strict; 
use Text::CSV; 
use Data::Dumper; 


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, "<", "test.csv" or die "test.csv: $!"; 

while (my $row = $csv->getline($fh)) { 
    push @{$rows}, $row; 
} 

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

close $fh; 

# This gets rid of spaces at start and end of string 
# as well as newlines within the fields. 
for (0 .. scalar @{$rows}-1) { 
    $rows->[$_][2] =~ s/^\s*//; 
    $rows->[$_][2] =~ s/\n/ /gms; 
} 

print Dumper($rows); 

Produziert die folgende Ausgabe:

$VAR1 = [ 
      [ 
      '1', 
      'A', 
      'Length of x, where x is y' 
      ], 
      [ 
      '2', 
      'B', 
      'Set A to “10”, an invalid state' 
      ], 
      [ 
      '3', 
      'C', 
      'Solve A+B and B+A ' 
      ], 
      [ 
      '4', 
      'D', 
      'Set C to B' 
      ] 
     ]; 

welche (ich vermute) ist das, was Sie erreichen wollen

+0

Genau das, was ich wollte. Dies kümmert sich sogar um die neue Zeile, die in meiner gedruckt wird. Danke vielmals. – Vikyboss

+0

Mein Vergnügen. Freut mich, Ihnen behilflich zu sein. – user1269651

0

Danke Jeder, der kommentierte, fand ich heraus. Das, was ich nicht tat, war nicht

{ binary => 1, eol => $/ } 

ist der Arbeitscode:

#!/usr/bin/perl 

use 5.010; 
use strict; 
use warnings; 
use Text::CSV; 

open(my $Fh, "<", 'datalane_csr.csv'); 

my $csv = Text::CSV->new ({ binary => 1, eol => $/ }); 
while (my $row = $csv->getline ($Fh)) { 
    say @$row[2]; 
    } 

close(CSV); 

Noch einmal vielen Dank. Und Entschuldigung für die Post.

Aber ich habe ein kleines Problem, die '"' als wierd Zeichen angezeigt wird, wenn ich sie drucken

Verwandte Themen