Postgres - 复制(剥离双引号)

时间:2012-02-23 17:21:53

标签: postgresql csv import copy

我正在使用Postgres 8.4.4副本http://www.postgresql.org/docs/8.4/static/sql-copy.html将CSV数据导入我的数据库。我的源数据中的某些值包含双引号,这些引号在插入时被剥离,而当我通过psql执行INSERT或UPDATE语句以测试双引号时会保留。也许给出一个关于发生了什么的线索,一些值也包含逗号,这些逗号会根据需要保留。

我试图根据http://www.postgresql.org/docs/8.3/interactive/sql-syntax-lexical.html中的信息解决问题,但没有成功。

我正在使用的复制命令是:

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

源数据用逗号分隔符双引号。如有必要,可以更改......

“价值”,“另一个价值”,“这是”另一个“价值”,“不再,谢谢”

1 个答案:

答案 0 :(得分:7)

您必须引用嵌入式引号。 默认值是它们的两倍,因此您的数据应为:

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

另一种方法是不加引号(但你必须引用逗号,如果有的话),比如

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

更新:这有效,但您必须确保引用嵌入的'\ n'(在这种情况下通过添加反斜杠)

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;