2013-12-05 6 views
7

Ich habe CSV-Dateien, Tab-getrennt, Felder nicht in Anführungszeichen verpackt, wo Felddaten Zeichen wie einfache Anführungszeichen, doppelte Anführungszeichen, Pipes und Backslashes enthalten können.Kann die Angebotsverarbeitung im Postgres COPY-Befehl im CSV-Format deaktiviert werden?

Beispieldaten können wie folgt aussehen:

1  2  "ba$aR\eR\  18 

ich diese Daten in Postgres mit der COPY-Anweisung importiert werden soll.

Wenn ich versuche, diese

COPY <tablename> FROM <filename> NULL AS ''; 

ich psql:-:1: ERROR: missing data for column einen Fehler mit zu importieren, da Postgres den Backslash + Tab behandelt als „Tab entkommen“ anstelle eines Schrägstrich durch die Feldtrenn gefolgt. Also wechselte

ich das „CSV-Format“ des COPY-Operators, etwa so:

COPY <tablename> FROM <filename> WITH CSV DELIMITER E'\t' NULL AS ''; 

Jetzt gibt es einen neuen Fehler psql:-:1: ERROR: value too long for type character varying(254)

Offenbar, weil es die doppelten Anführungszeichen zu Beginn der Interpretation von Feld 3 als Feldumbruchzeichen.

Wie kann ich angeben, dass meine Daten NICHT überhaupt zitiert werden?

+1

warum schreiben nicht Ihre Abhilfe als Antwort? –

+1

danke für den Tipp, fertig! –

+0

Mögliches Duplikat von [Ignoriere Anführungszeichen beim Importieren einer CSV-Datei in PostgreSQL?] (Http://stackoverflow.com/questions/7376322/ignore-quotation-marks-when-importing-a-csv-file-into-postgresql) –

Antwort

18

Umgehung (dank this comment!)

COPY <tablename> FROM <filename> WITH CSV DELIMITER E'\t' QUOTE E'\b' NULL AS ''; 

Also im Grunde ein Anführungszeichen angeben, die nie im Text sein sollen, aber das ist ziemlich hässlich.

Ich würde es viel lieber, wenn es in der Tat eine Möglichkeit, Angebotsbearbeitung insgesamt deaktivieren würde.

0

(als neue Antwort hinzugefügt, da ich den Ruf haben noch nicht zu kommentieren.)

Für das Protokoll, da ich mit dem gleichen Problem zu kämpfen, Sie tr\b entfernen können, anstelle von nur in der Hoffnung es ist nicht in Ihrem Text überall.

tr -d '\010' <filename.csv> newfile.csv 

(verwenden, das die \010octal representation von \b ist).

Da COPY unterstützt von STDIN lesen, können Sie die E/A-Auswirkungen erleichtern durch tr ‚s Ausgangsrohrleitungen:

cat filename.csv | tr -d '\010' | COPY <tablename> FROM STDIN WITH CSV DELIMITER E'\t' QUOTE E'\b' NULL AS ''; 
Verwandte Themen