Ich verwende eine iPhone-App, die mir regelmäßig ein Protokoll im CSV-Format schickt. Ich habe ein Ruby-Skript, das die Daten in diesem Protokoll mit älteren Logs summiert. Vor Kurzem hat der App-Entwickler ein Update veröffentlicht, das aus einem unbekannten Grund am Ende jeder Zeile einen Wagenrücklauf eingefügt hat, wodurch mein Skript fehlgeschlagen ist. Gemäß den Dokumenten sollte :row_end
standardmäßig :auto
sein, das entweder \r\n
oder \n
(in 1.9.2) akzeptieren sollte. Ich habe versucht, Ruby 1.8.7, 1.9.2 und FasterCSV mit 1.8.7 zu verwenden. Ich bekomme verschiedene Fehlermeldungen mit diesen verschiedenen Versuchen, einschließlich
CSV::IllegalFormatError
\r
oder \n
(Zeile 1) ( FasterCSV::MalformedCSVError
) NilClass
(TypeError) in 1.9.2. (Die \r
ist nicht in einem Feld, es ist das Ende der Zeile!) Die Daten sahen früher so aus:
Jetzt sieht es so aus:
%Vor% Wenn Sie denken, dass CSV denkt, dass ^M
im letzten Feld ist, habe ich versucht, ein weiteres Komma hinzuzufügen:
ohne Erfolg.
Das Einzige, was ich mir vorstellen kann, ist, dass CSV alle Felder in doppelte Anführungszeichen setzen muss? Ich kann mir verschiedene Problemumgehungen vorstellen, wie das erste Lesen der Datei, das Chomping der Enden und dann die Verarbeitung des Arrays mit CSV, aber zuerst möchte ich herausfinden, was ich falsch mache. Es scheint, als ob es funktionieren sollte.
Übrigens ist mein Code einfach:
%Vor% und ich habe versucht, :row_end => "\r\n"
vergebens zu setzen.
Ich bin auf Mac OS X 10.6.8.
Funktioniert für mich in 1.9.3:
%Vor%Und die Datei enthält tatsächlich Zeilenumbrüche:
%Vor% Da CSV die gesamte Datei lesen / analysieren muss, wenn row_end
automatisch ist, musste ich folgendes tun, um die Formatierung und die Codierung von Ausnahmen zu verhindern.
File.read
Hinweis: Ich verwende Version Ruby 2.1.3 für eine Rails 4-Anwendung.
Versuchen Sie, row_end
auf
Das ist anders als '\ r \ n': Einzelne Strings in Anführungszeichen erlauben nur das Ausbrechen 'und \, jedes andere wird als ein Literal behandelt, dh
%Vor%Ist wahr
Sie haben versucht, :row_end => '\r\n'
zu versuchen. Einfache Anführungszeichen behandeln (die meisten Instanzen von) Backslashes als normale Backslash-Zeichen; probiere :row_end => "\r\n"
mit doppelten Anführungszeichen.
Die Zeilen der Datei enden eigentlich mit \ r \ r \ n, nicht \ r \ n Das ist peinlich, ich hätte die Datei genauer prüfen sollen. ich nahm an, dass das Ende der Zeile war \ n, da ich auf einer Unix-Box bin. Aber als Emacs die Datei öffnete, ging es automatisch in den "DOS" -Modus, so dass es \ r \ n als neue Zeile angezeigt wurde und nur das Extra \ r als "^ M"
angezeigt wurde