15 Stimmen

Überwindung eines grundlegenden Problems beim CSV-Parsing mit dem FasterCSV-Gem

Ich habe ein CSV-Parsing-Problem mit FasterCSV (1.5.0) gefunden, das ein echter Fehler zu sein scheint, für den ich aber hoffe, dass es eine Lösung gibt.

Grundsätzlich erzeugt das Hinzufügen eines Leerzeichens nach dem Trennzeichen (in meinem Fall ein Komma), wenn die Felder in Anführungszeichen eingeschlossen sind, ein MalformedCSVError .

Hier ist ein einfaches Beispiel:

# No quotes on fields -- works fine
FasterCSV.parse_line("one,two,three")
=> ["one", "two", "three"]

# Quotes around fields with no spaces after separators -- works fine
FasterCSV.parse_line("\"one\",\"two\",\"three\"")
=> ["one", "two", "three"]

# Quotes around fields but with a space after the first separator -- fails!
FasterCSV.parse_line("\"one\", \"two\",\"three\"")
=> FasterCSV::MalformedCSVError: Illegal quoting on line 1.

Bin ich verrückt, oder ist dies ein Fehler in FasterCSV?

14voto

Ben James Punkte 113987

El MalformedCSVError ist hier richtig.

Führende und abschließende Leerzeichen im CSV-Format werden nicht ignoriert, sondern als Teil eines Feldes betrachtet. Das bedeutet also, dass Sie ein Feld mit einem Leerzeichen begonnen und dann nicht abgeschlossene doppelte Anführungszeichen in das Feld eingefügt haben, was den Fehler "illegale Anführungszeichen" verursachen würde.

Vielleicht ist diese Bibliothek einfach strenger als andere, die Sie verwendet haben.

2voto

Robert Massa Punkte 4115

Vielleicht können Sie die Option :col_sep: auf ', ' setzen, um solche Dateien zu parsen.

2voto

Mike Woodhouse Punkte 50241

Ich hatte gehofft, dass die :col_sep könnte einen regulären Ausdruck zulassen, aber er scheint sowohl zum Lesen als auch zum Schreiben verwendet zu werden, was schade ist. Die Dokumentation macht nicht viel Hoffnung, und Ihr Bedürfnis ist wahrscheinlich dringender, als dass es durch einen Änderungsantrag oder die Einreichung eines Patches befriedigt werden könnte ;-)

Wenn Sie anrufen #parse_line explizit, dann können Sie immer

gsub(/,\s*/, ',')

auf Ihrer Eingabeleitung. Dieser reguläre Ausdruck muss möglicherweise erheblich geändert werden, wenn Sie die Möglichkeit von Kommas in Anführungszeichen vorsehen. (Ich würde vorschlagen, eine solche Frage hier mit einem geeigneten Tag zu posten und die RegEx-Experten darauf loszulassen, falls dies der Fall sein sollte).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X