2013-01-25 2 views
6

Ich möchte eine CSV-Datei in Version 9.2 importieren, aber die CSV-Datei enthält doppelte Anführungszeichen in der letzten Spaltenposition, um einen NULL-Wert darzustellen :kann CSV nicht in PostgreSQL-Tabelle kopieren: Zeitstempelspalte akzeptiert keine leere Zeichenfolge

"2","1001","9","2","0","0","130","","2012-10-22 09:33:07.073000000",""

, die auf eine Säule des Typs Zeitstempel zugeordnet ist. postgreSQL mag das "" nicht. Ich habe versucht, die NULL-Option zu setzen, aber vielleicht mache ich es nicht richtig? Ich habe versucht NULL as '"" und NULL '' und NULL as '' und NULL "" aber ohne Erfolg; hier ist mein Befehl:

COPY SCH.DEPTS 
FROM 'H:/backups/DEPTS.csv' 
WITH (
FORMAT CSV, 
DELIMITER ',' , 
NULL '', 
HEADER TRUE, 
QUOTE '"' 
) 

aber es funktioniert nicht mit einem Fehler:

ERROR: invalid input syntax for type timestamp: ""

CONTEXT: COPY depts, line 2, column expirydate: ""

P. S. Gibt es eine Möglichkeit, die Zeichenfolgendarstellung von Booleans zu dem Befehl COPY anzugeben? Das Dienstprogramm, das die CSVs erzeugte (von denen es viele gibt), verwendete "falsch" und "wahr".

Antwort

7

Der leere String ("") ist kein gültiger Zeitstempel und COPY scheint keinen FORCE NULL oder FORCE EMPTY TO NULL Modus zu bieten; es hat das Gegenteil, FORCE NOT NULL, aber das wird nicht tun, was Sie wollen.

Sie müssen wahrscheinlich die Daten in eine Tabelle mit einem text Feld für den Zeitstempel COPY, wahrscheinlich ein UNLOGGED oder TEMPORARY Tisch, dann ein INSERT INTO real_table SELECT col1, col, col3, NULLIF(tscol,'') FROM temp_table; verwenden.

COPY sollte true und false als Booleans akzeptieren, so sollten Sie keine Probleme haben.

Alternativ lesen Sie die CSV mit einem einfachen Python-Skript und dem csv Modul, und verwenden Sie dann psycopg2 zu COPY Zeilen in Pg. Oder schreibe einfach eine neue gesäuberte CSV-Datei und füttere diese in COPY. Oder verwenden Sie ein ETL-Tool, das Datentransformationen wie Pentaho Kettle oder Talend ausführt.

+0

Dieses Exportformat von MSFT unterscheidet sich von jeder anderen CSV-Datei dadurch, dass es alle Werte angibt, unabhängig davon, ob sie numerisch oder Zeichenfolgen sind. Fast so, als würden sie den Export absichtlich weniger nützlich machen ;-) Es sendet "wahr" und nicht "wahr". Zeit, die Exporte zu bereinigen. Danke für die Vorschläge von Kettle und Talend. – Tim

Verwandte Themen