Ich erhalte einen großen Hash der Ergebnisse aus einer Datenbankabfrage und schreibe sie in eine CSV-Datei. Der folgende Codeblock übernimmt die Ergebnisse und erstellt die CSV-Datei. Mit der Option quote_char:
werden die Anführungszeichen durch NULL-Zeichen ersetzt, die für die korrekte Erstellung der durch Tabulatorzeichen getrennten Datei benötigt werden.
Allerdings werden die NULL-Zeichen in "" umgewandelt, wenn sie in ihr Ziel geladen werden, also möchte ich diese entfernen. Wenn ich quote_char:
weglasse, wird jedes Feld doppelt zitiert, was zu dem gleichen Ergebnis führt.
Wie kann ich die NULL-Zeichen entfernen?
%Vor% Wie in der CSV-Dokumentation angegeben, müssen Sie dies tun Setzen Sie quote_char
auf ein beliebiges Zeichen, und dieses Zeichen wird immer verwendet, um leere Felder zu zitieren.
Es scheint die einzige Lösung in diesem Fall zu sein, die verwendete quote_chars
aus der erstellten CSV-Datei zu entfernen. Du kannst es so machen:
Ich nehme an, dass NULL's die einzigen entdeckten Felder sind. Wenn dies nicht der Fall ist, verwenden Sie den Standard quote_char: '"'
und gsub(',"",', '')
, der fast alle möglichen Fälle von Feldern mit Sonderzeichen behandeln soll.
Wenn Sie jedoch feststellen, dass die Ergebnisse Ihrer Abfrage groß sind, ist es möglicherweise praktischer, die csv-Datei selbst zu erstellen und eine doppelte Verarbeitung der Ausgaben zu vermeiden. Sie könnten einfach schreiben:
%Vor%Auch hier müssen Sie möglicherweise Felder mit Sonderzeichen bearbeiten.
Aus den Ruby-CSV -Dokumenten Die Einstellung von force_quotes: false
in den Optionen scheint zu funktionieren.
Das obige macht den Trick. Ich würde vorschlagen, quote_char
auf
zu setzen, da dies nicht wie erwartet funktioniert. ""
Es gibt jedoch eine Sache zu beachten. Wenn das Feld eine leere Zeichenfolge quote_char
ist, wird das nil
in die CSV-Datei gedruckt. Aber seltsamerweise ein nil
Wert nicht. Ich würde vorschlagen, dass, wenn Sie überhaupt leere Zeichenfolgen in den Daten erwarten, Sie sie irgendwie in presence
konvertieren, wenn Sie in die CSV schreiben (vielleicht mit der Methode ActiveSupport %code% oder etwas Ähnliches).
Erstens ist eine durch Tabulatoren getrennte Datei "TSV", im Gegensatz zu einer durch Kommas getrennten Datei, die "CSV" ist.
Das Umbrechen von Anführungszeichen um Felder ist immer dann notwendig, wenn das Feldtrennzeichen in einem Feld vorkommen kann.
Wie werden Sie diese Zeichenfolge beispielsweise in eine durch Tabstopps getrennte Datei einbetten?
%Vor% Die \t
ist die Darstellung eines eingebetteten Tabs .
Dasselbe Problem tritt beim Schreiben einer CSV-Datei mit einem Feld auf, das Kommas enthält. Das Feld muss in doppelte Anführungszeichen eingeschlossen werden, um das Feld selbst zu begrenzen.
Wenn Ihre Eingabe Daten enthält, die maskiert werden müssen (z. B. das Spaltentrennzeichen oder das Anführungszeichen), müssen Sie Ihre Daten angeben. Sonst kann es später nicht richtig geparst werden.
%Vor% Die CSV-Klasse gibt nichts unnötigerweise an (wie Sie oben sehen können). Ich bin also nicht sicher, warum Sie sagen, dass alle Ihre Felder zitiert werden. Es könnte irgendwie sein force_quotes
wird irgendwo auf true gesetzt.
Wenn Sie absolut sicher sind, enthalten Ihre Daten niemals \t
oder "
, dann sollte der Standard quote_char
( "
) problemlos funktionieren. Wenn Sie sonst nichts angeben möchten, müssen Sie ein anderes Anführungszeichen auswählen, das in Ihren Daten absolut sicher ist .