2012-02-23 114 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