将 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的主要内容,如果未能解决你的问题,请参考以下文章

将 Mysql CSV 导入 PostgreSQL

将 csv 导入到 postgresql:缺少列的数据

将压缩的 CSV 文件导入 PostgreSQL

如何将 .csv 文件导入 Hasura PostgreSQL 数据库?

将 CSV 导入到 postgreSQL 中的表中,忽略重复项 - 亚马逊 AWS/RDS

从命令行导入 PostgreSQL CSV