如何导入包含jsonb列类型的CSV

时间:2019-12-13 17:59:16

标签: postgresql pgadmin

我正在尝试使用csv将数据导入具有jsonb列类型的表中。我读过csv specs,说任何包含双引号的列值都需要:

  1. 用引号引起来(在开头和结尾使用双引号)
  2. 双引号用双引号转义(因此,如果要双引号,则必须使用2个双引号而不是仅使用1个双引号)

我的jsonb类型的csv列值如下所示(为简洁起见,简称:):

"[
   {
      ""day"": 0,
      ""schedule"": [
         {
            ""open"": ""07:00"",
            ""close"": ""12:00""
         }
      ]
   }
]"

注意:万一编辑器进行了特殊的转义操作,请在notepad ++中打开此csv,所有引号应与编辑器中显示的相同。

PGAdmin Error Message

现在我很好奇该PGAdmin错误消息中的QUOTEESCAPE值是什么,因此在这里将它们复制/粘贴:

  • QUOTE '\"'
  • ESCAPE '''';""

要上传到PGAdmin,我是否需要使用\"围绕每个json标记,如错误消息中该QUOTE值所建议的那样(可能?)?

我正在使用Go的encoding/csv软件包编写csv。

3 个答案:

答案 0 :(得分:1)

我可以使用以下方法将文件加载到json或jsonb类型的列中:

copy j from '/tmp/foo.csv' csv;

copy j from '/tmp/foo.csv' with (format csv);

或它们的\ copy等效项。

根据您截断的(不完整的)文本发布为图像,很难说出您实际在做什么。但是,如果您做对了,它将起作用。

答案 1 :(得分:0)

我发现最简单的解决方法是将json数据复制到临时登台表中的text列中。

然后发出遵循以下模式的查询:

insert into mytable (...) select ..., json_txtcol::json from staging_table

答案 2 :(得分:0)

您可以在PostgreSQL接收数据之前通过另一个命令对其进行处理,以转义的双引号替换双引号。

例如:

COPY tablename(col1, col2, col3)
FROM PROGRAM $$sed 's/""/\\"/g' myfile.csv$$
DELIMITER ',' ESCAPE '\' CSV HEADER;

这是一个可行的示例:

/tmp/input.csv包含:

Clive Dunn, "[ { ""day"": 0, ""schedule"": [{""open"": ""07:00"", ""close"": ""12:00""}]}]", 3

在psql中(但应在PgAdmin中工作):

postgres=# CREATE TABLE test (person text, examplejson jsonb, num int);
CREATE TABLE
postgres=# COPY test (person, examplejson, num) FROM PROGRAM $$sed 's/""/\\"/g' /tmp/input.csv$$  CSV DELIMITER ',' ESCAPE '\';
COPY 1
postgres=# SELECT * FROM test;
   person   |                           examplejson                           | num 
------------+-----------------------------------------------------------------+-----
 Clive Dunn | [{"day": 0, "schedule": [{"open": "07:00", "close": "12:00"}]}] |   3
(1 row)

披露:我是EnterpriseDB(EDB)员工。