我正在尝试使用csv将数据导入具有jsonb列类型的表中。我读过csv specs,说任何包含双引号的列值都需要:
我的jsonb
类型的csv列值如下所示(为简洁起见,简称:):
"[
{
""day"": 0,
""schedule"": [
{
""open"": ""07:00"",
""close"": ""12:00""
}
]
}
]"
注意:万一编辑器进行了特殊的转义操作,请在notepad ++中打开此csv,所有引号应与编辑器中显示的相同。
现在我很好奇该PGAdmin错误消息中的QUOTE
和ESCAPE
值是什么,因此在这里将它们复制/粘贴:
QUOTE '\"'
ESCAPE '''';""
要上传到PGAdmin,我是否需要使用\"
围绕每个json标记,如错误消息中该QUOTE
值所建议的那样(可能?)?
我正在使用Go的encoding/csv
软件包编写csv。
答案 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)员工。