Universal newline support in Rubin, umfasst \r (CR) line endings
In eine Rails-app, die ich bin zu akzeptieren und zu Parsen von CSV-Dateien, die kommen können formatiert mit jedem der drei möglichen Beendigung der Zeile-Zeichen: \n
(LF
), \r\n
(CR+LF
), oder \r
(CR
). Ruby ' s File
und CSV
Bibliotheken scheinen mit den ersten zwei Fällen ganz gut, aber der Letzte Fall ("Mac classic" \r
Zeilenenden) nicht behandelt, wie ein Zeilenumbruch. Es ist wichtig, zu verstehen, zu akzeptieren, dieses format so gut wie die anderen, da Microsoft Excel für Mac (unter OS X) scheint es zu benutzen, beim exportieren in ein "Comma Separated Values" (obwohl exportieren "Windows-Komma-Getrennt" produziert, die leichter zu handhabende \r\n
).
Python hat "universal newline support" und mit jedem dieser drei Formate ohne Probleme. Gibt es etwas ähnliches in Ruby wird akzeptieren, dass alle drei, ohne zu wissen, das format im Voraus?
- Nein, Ruby tut dies nicht. Es erkennt die OS, und auf dieser Grundlage davon ausgegangen, das richtige line-endings. Der alte Macintosh -
\r
ist nicht gesehen in der aktuellen Ausgabe, da die Mac-verschoben auf Mac OS X, die verwendet, *nix\n
. Zeigen Sie uns, wie Sie öffnen Sie Ihre CSV-Dateien, und wir können wahrscheinlich zeigen Ihnen einige tricks, um alle die erwähnten line-endings mit einem kleinen kniff. - Das problem ist, dass Sie bekommen konnte, ein old-school-MacOS CSV-Datei mit
\r
EOLs, wenn Sie arbeiten auf Linux, erwartet wird\n
EOLs. Also die Datei und das OS wird nicht unbedingt Zustimmen, was die CSV-Datensatz-Trennzeichen werden sollte.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie
:row_sep => :auto
:Es gibt einige Einschränkungen natürlich finden Sie im Handbuch im Zusammenhang mit oben für details.
Könnte man auch manuell bereinigen, die EOLs mit ein bisschen
gsub
ing vor der übergabe der Daten im CSV-Format für die Analyse. Ich würde wahrscheinlich diesen Weg gehen und manuell konvertieren alle\r\n
s und\r
s single\n
s, bevor Sie versuchen zu Parsen der CSV-Datei. OTOH, das funktioniert nicht gut, wenn es eingebettet ist binäre Daten in Ihrer CSV-wo\r
s etwas zu bedeuten. Auf der Greif-Seite, das ist CSV, die wir zu tun haben, also wer weiß, was für verrückte gebrochen Unsinn werden Sie am Ende zu tun haben.:auto
sieht für den ersten der drei EOLs und gilt, dass an der ganzen Sache. Im realen Leben würde ich wahrscheinlich Vorverarbeiten der Daten, die Standardisierung der EOLs an\n
vor etwas zu tun, CSV ist so ein schrecklich missbraucht-format, die Sie nie wissen, welche Art von vermasselt Unsinn, den Sie gehen, um mit zu tun.input.gsub(/\r\n?/, "\n")
?