1. 程式人生 > >不能將CSV複製到postgreSQL表中:列不接受空字串

不能將CSV複製到postgreSQL表中:列不接受空字串

我要將CSV檔案匯入9.2版,但CSV檔案在最終列位置中具有雙引號雙引號以表示NULL值:

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

,它對映到型別為Timestamp的列。 postgreSQL不喜歡“”。我試圖設定NULL選項,但也許我不是做正確嗎?我嘗試了 NULL as'“和 NULL''和 NULL as' 和 NULL“”但未成功;這是我的命令:

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

,但失敗並顯示錯誤:

錯誤:型別為timestamp的輸入語法無效:

CONTEXT:COPY depts,line 2,column expirydate:“”

PS有一種方法可以指定布林值到COPY命令的字串表示形式?生成CSV(其中有很多)的實用程式使用“false “和”true“。

解決方案

空字串(”“)不是有效的時間戳, COPY 似乎不提供 FORCE NULL 或 FORCE EMPTY TO NULL 模式;它有相反的, FORCE NOT NULL ,但這不會做你想要的。

可能需要將 COPY 資料匯入具有文字欄位的表格,可能是 UNLOGGED 或 TEMPORARY 表,然後使用 INSERT INTO real_table SELECT col1,col,col3,NULLIF(tscol, ')FROM temp_table; 。

COPY true 和 false 作為布林值,因此您不應該有任何問題。

或者,使用簡單的Python指令碼和 csv 模組讀取CSV,然後使用 psycopg2 到 COPY 行插入Pg。或者只需寫入新的清理過的CSV並將其送入 COPY 。或使用執行資料變換(如Pentaho Kettle或Talend)的ETL工具。