Wie kann ich analysieren zitiert CSV in Perl mit regex?

Ich habe einige Probleme mit dem Parsen von CSV-Daten, die mit Anführungszeichen. Mein Hauptproblem ist mit Anführungszeichen innerhalb eines Feldes. Im folgenden Beispiel werden die Zeilen 1 - 4 die Arbeit korrekt, aber 5,6 und 7 nicht.

COLLOQ_TYPE,COLLOQ_NAME,COLLOQ_CODE,XDATA
S,"BELT,FAN",003541547,
S,"BELT V,FAN",000324244,
S,SHROUD SPRING SCREW,000868265,
S,"D" REL VALVE ASSY,000771881,
S,"YBELT,"V"",000323030,
S,"YBELT,'V'",000322933,

Ich möchte vermeiden, Text::CSV, da es nicht auf dem Zielserver installiert. Zu realisieren, dass die CSV ' s sind komplizierter als Sie Aussehen, ich bin mit einem Rezept aus dem Perl-Kochbuch.

sub parse_csv {
  my $text = shift; #record containg CSVs
  my @columns = ();
  push(@columns ,$+) while $text =~ m{
    # The first part groups the phrase inside quotes
    "([^\"\\]*(?:\\.[^\"\\]*)*)",?
      | ([^,]+),?
      | ,
    }gx;
  push(@columns ,undef) if substr($text, -1,1) eq ',';
  return @columns ; # list of vars that was comma separated.
}

Hat jemand einen Vorschlag zur Verbesserung der regex zum behandeln der oben genannten Fällen?

Sind nicht Linien 5, 6 und 7 ungültige CSV?

InformationsquelleAutor Mark Nold | 2009-03-11

Schreibe einen Kommentar