2012-02-23 183 views
2

我使用Postgres 8.4.4複製,http://www.postgresql.org/docs/8.4/static/sql-copy.html,將CSV數據導入到我的數據庫中。我的源數據中的一些值包含雙引號,插入時會被剝離,而當我通過psql執行INSERT或UPDATE語句來測試雙引號時,它將被保留。也許提供一些關於發生什麼的線索,有些值還包含根據需要保留的逗號。Postgres - 複製(刪除雙引號)

我試圖根據http://www.postgresql.org/docs/8.3/interactive/sql-syntax-lexical.html中的信息解決問題,但沒有成功。

我使用copy命令是:

copy my_table (field_1, field_2, field_3 ...) from '/tmp/source.csv' with csv 

源數據的雙引號用逗號分隔符。這可以根據需要改變......

「價值」,「另一種價值」,「這是‘另一種’價值」,「沒了,謝謝」

+0

源數據用逗號分隔符雙引號。如有必要, – 2012-02-23 17:27:30

+0

請添加一段csv文件。 – wildplasser 2012-02-23 17:28:44

+0

已添加,對不起,它不是原始帖子的一部分。 – 2012-02-23 17:29:51

回答

3

你必須引用嵌入式報價。 默認是他們的兩倍,所以你的數據應該是:

"value","another value","this is ""another"" value","no more, thanks" 

另一種方式是工作不需要加引號(但你必須引用的逗號,如果有的話),像

value,another value,this is "another" value,no more, thanks 

UPDATE :這可行,但你必須確保嵌入的''被引用(在這種情況下通過添加反斜槓)

DROP TABLE tmp.my_table CASCADE; 
CREATE TABLE tmp.my_table 
     (field_1 varchar 
     , field_2 varchar 
     , field_3 varchar 
     , field_4 varchar 
     ); 

COPY tmp.my_table (field_1,field_2,field_3,field_4) 
FROM STDIN 
WITH CSV DELIMITER ',' QUOTE '"' ESCAPE '\' 
     ; 
"value","another value","this is \"another\" value","no more, thanks" 
\. 
     ; 

SELECT * FROM tmp.my_table; 
+0

我引用了嵌入式引用,暗示了這一點。自第一次工作以來,我沒有嘗試其他建議。我很感激幫助。 – 2012-02-23 19:20:21

+0

對不起。因爲這種東西總是*在系統*之間,所以有時候不得不訴諸於sed腳本,而且更糟。但一個真正的DBA必須處理這種狗屎。這是生活中的一個事實,所以它似乎... – wildplasser 2012-02-23 22:05:39

+0

如果您有合理的控制權或至少知道將顯示哪些字符,您可以選擇一個不會出現在文本中的QUOTE字符(如'\'' )。我使用了一個類似的設置,使用不同的QUOTE和DELIMITER字符(分別爲\和〜)來讀取一組java文件(Key =值格式)到數據庫中。 – Gumbatron 2014-07-31 00:16:44