Ich habe CSV-Dateien, Tab-getrennt, Felder nicht in Anführungszeichen eingeschlossen, wo Felddaten Zeichen wie einfache Anführungszeichen, doppelte Anführungszeichen, Pipes und umgekehrte Schrägstriche enthalten können.
Beispieldaten können wie folgt aussehen:
%Vor%Ich möchte diese Daten mit der COPY-Anweisung in Postgres importieren.
Wenn ich versuche, dies mit
zu importieren %Vor% Ich erhalte den Fehler psql:-:1: ERROR: missing data for column
, weil Postgres den Backslash + Tab als "Escape-Tab" behandelt und nicht als Backslash, gefolgt vom Feldtrennzeichen.
Ich habe also das "CSV-Format" des COPY-Operators gewählt:
%Vor% Jetzt gibt es einen neuen Fehler psql:-:1: ERROR: value too long for type character varying(254)
Offenbar, weil es das doppelte Anführungszeichen am Anfang von Feld 3 als Feldumbruchzeichen interpretiert.
Wie kann ich angeben, dass meine Daten NICHT überhaupt zitiert werden?
Workaround (Danke an diesen Kommentar !)
%Vor%Also im Grunde ein Zitat-Zeichen, das nie im Text sein sollte, aber das ist ziemlich hässlich.
Ich würde es sehr bevorzugen, wenn es tatsächlich eine Möglichkeit gäbe, die Angebotsverarbeitung ganz abzuschalten.
(Als neue Antwort hinzugefügt, da ich noch nicht die Reputation habe, sie zu kommentieren.)
Zum Beispiel, da ich mit dem gleichen Problem zu kämpfen habe, können Sie tr
verwenden, um \b
zu entfernen, anstatt nur hoffe es ist nirgends in Ihrem Text.
(Unter Verwendung von 0
ist die oktale Darstellung von \b
).
Da COPY
das Lesen von STDIN
unterstützt, können Sie den I / O-Einfluss verringern, indem Sie tr
ausgeben:
Der Modus, den Sie für Daten verwenden möchten, die wie beschrieben formatiert sind, ist der Standardtextmodus. Es wird die meisten Charaktere ungehindert in die Datenbank passieren. Es hat keine Quote-Verarbeitung, und es verwendet Tabs als Trennzeichen. Die Verwendung des CSV-Modus führt nur zu Problemen, da Sie angeben müssen, dass Sie arbeiten müssen.
Im Textmodus werden Dollarzeichen, einfache und doppelte Anführungszeichen, Pipes und sogar Leerzeichen (auch wenn dies in der Frage nicht erwähnt wurde) direkt übergeben. Das einzige im Beispiel ist das nicht passiert ist Backslashes. Aber das ist so einfach wie das Entweichen von ihnen, zum Beispiel durch den Befehl sed
:
Dann sollte die verarbeitete Datei ohne zusätzliche Optionen importiert werden können:
%Vor%Tags und Links postgresql csv import