将 CSV 文本数组导入 PostgreSQL 9.2
Posted
技术标签:
【中文标题】将 CSV 文本数组导入 PostgreSQL 9.2【英文标题】:Import CSV text array into PostgreSQL 9.2 【发布时间】:2013-04-16 10:20:38 【问题描述】:我有类似这样的数据:
Akhoond,1,Akhoond,"""Akhund"", ""Akhwan""",0
pgAdmin 的导入拒绝了这一点。 CSV 中的 text[] 需要采用什么格式?
我也试过这个:
Akhoond,1,Akhoond,"Akhund, Akhwan",0
这是表的创建:
CREATE TABLE private."Titles"
(
"Abbrev" text NOT NULL,
"LangID" smallint NOT NULL REFERENCES private."Languages" ("LangID"),
"Full" text NOT NULL,
"Alt" text[],
"Affix" bit
)
WITH (
OIDS=FALSE
);
ALTER TABLE private."Titles" ADD PRIMARY KEY ("Abbrev", "LangID");
CREATE INDEX ix_titles_alt ON private."Titles" USING GIN ("Alt");
ALTER TABLE private."Titles"
OWNER TO postgres;
【问题讨论】:
它在最后一个预期列之后抛出“额外数据”。我检查过,DB 中有 5 列,CSV 中有 5 列。 如果您手动创建一个包含一两行所需数据的虚拟表,然后从 PgAdmin-III 导出它怎么办?它产生什么格式,然后正确导入它?如果它导出但不导入,则您发现了一个错误。坦率地说,如果它不使用与标准COPY
命令相同的语法,我认为这是一个错误。
【参考方案1】:
查找的最佳方法是创建一个包含所需值的表和COPY ... TO STDOUT
来查看:
craig=> CREATE TABLE copyarray(a text, b integer, c text[], d integer);
CREATE TABLE
craig=> insert into copyarray(a,b,c,d) values ('Akhoond',1,ARRAY['Akhund','Akhwan'],0);
INSERT 0 1
craig=> insert into copyarray(a,b,c,d) values ('Akhoond',1,ARRAY['blah with spaces','blah,with,commas''and"quotes'],0);
INSERT 0 1
craig=> \copy copyarray TO stdout WITH (FORMAT CSV)
Akhoond,1,"Akhund,Akhwan",0
Akhoond,1,"""blah with spaces"",""blah,with,commas'and\""quotes""",0
所以看起来"Akhund,Akhwan"
很好。请注意我添加的第二个示例,该示例展示了如何处理数组文本中的逗号、引号空格。
这适用于 psql \copy
命令;如果它不与 PgAdmin-III 一起工作,那么我建议使用 psql
和 \copy
。
【讨论】:
以上是关于将 CSV 文本数组导入 PostgreSQL 9.2的主要内容,如果未能解决你的问题,请参考以下文章
如何将 .csv 文件导入 Hasura PostgreSQL 数据库?