Ruby CSV versteht \ r \ n nicht als Zeilenende

7

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
  • Nicht angegebene Felder lassen \r oder \n (Zeile 1) ( FasterCSV::MalformedCSVError )
  • nicht zu
  • kann nicht dup 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:

%Vor%

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:

%Vor%

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.

    
chetstone 18.05.2012, 20:07
quelle

5 Antworten

3

Funktioniert für mich in 1.9.3:

%Vor%

Und die Datei enthält tatsächlich Zeilenumbrüche:

%Vor%     
Mark Thomas 18.05.2012, 23:48
quelle
6

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.

  • Dekodiere die Datei durch File.read
  • Entfernen Sie diese lästigen Wagenrückläufe (könnte einer oder mehrere sein)
  • Parsen Sie die bereinigte Datei als CSV
%Vor%

Hinweis: Ich verwende Version Ruby 2.1.3 für eine Rails 4-Anwendung.

    
rxgx 12.02.2015 05:18
quelle
5

Versuchen Sie, row_end auf

zu setzen %Vor%

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

    
Frederick Cheung 18.05.2012 20:21
quelle
3

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.

    
echristopherson 18.05.2012 20:19
quelle
2

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     
chetstone 20.05.2012 16:23
quelle

Tags und Links