2013-01-25 8 views
6

Voglio importare un file CSV nella versione 9.2 ma il file CSV ha una virgoletta doppia citazione nella posizione della colonna finale per rappresentare un valore NULL :non può copiare CSV nella tabella postgreSQL: la colonna timestamp non accetta la stringa vuota

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

che è associata a una colonna di tipo Timestamp. a PostgreSQL non piace "". Ho provato a impostare l'opzione NULL ma forse non lo sto facendo correttamente? Ho provato NULL as '"" e NULL '' e NULL as '' e NULL "" ma senza successo; ecco il mio comando:

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

ma non riesce con un errore:

ERROR: invalid input syntax for type timestamp: ""

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

P.S. C'è un modo per specificare la rappresentazione della stringa di Booleans al comando COPY? L'utilità che ha prodotto i CSV (di cui ce ne sono molti) ha utilizzato "false" e "true".

risposta

7

La stringa vuota ("") non è un timestamp valido e COPY non sembra offrire una modalità FORCE NULL o FORCE EMPTY TO NULL; ha il retro, FORCE NOT NULL, ma quello non farà quello che vuoi.

è probabilmente necessario COPY i dati in una tabella con un campo text per il timestamp, probabilmente una tabella UNLOGGED o TEMPORARY, quindi utilizzare un INSERT INTO real_table SELECT col1, col, col3, NULLIF(tscol,'') FROM temp_table;.

COPY dovrebbe accettare true e false come booleani, quindi non si dovrebbero avere problemi lì.

In alternativa, leggere il CSV con un semplice script Python e il modulo csv e quindi utilizzare le righe psycopg2 in COPY in Pg. Oppure scrivi semplicemente il nuovo CSV ripulito e inseriscilo nello COPY. Oppure usa uno strumento ETL che trasforma dati come Pentaho Kettle o Talend.

+0

questo formato di esportazione da MSFT è diverso da qualsiasi CSV che ho visto prima, in quanto cita tutti i valori indipendentemente dal fatto che siano numerici o stringhe. Quasi come se stessero rendendo l'esportazione meno utile di proposito ;-) Sta inviando anche "true" 'not' true'. È ora di ripulire le esportazioni. Grazie per i suggerimenti di Kettle e Talend. – Tim

Problemi correlati