首页 > 解决方案 > PostgreSQL COPY 无法从 CSV 文件中读取 JSON

问题描述

我正在使用 COPY 将数据从 CSV 文件复制到 PostgreSQL 表中

我的 CSV 文件很简单:

0\"a string"

我的表“测试”是由以下创建的:

create table test (
id integer,
data jsonb
);

我的副本声明如下:

我收到以下错误:

williazz=# \copy test from 'test/test.csv' delimiters '\' CSV
ERROR:  invalid input syntax for type json
DETAIL:  Token "a" is invalid.
CONTEXT:  JSON data, line 1: a...
COPY test, line 1, column data: "a string"

有趣的是,当我将 CSV 文件更改为数字时,它没有问题。

CSV: 0\1505

williazz=# \copy test from 'test/test.csv' delimiters '\' CSV
COPY 1
williazz=# select * from test;
 id | data 
----+------
  0 | 1505
(1 row)

此外,数组中的数字也可以:

CSV:

1\[0,1,2,3,4,5]
williazz=# select * from test;
 id |     data      
----+---------------
  0 | 1505
  1 | [0,1,2,3,4,5]
(2 rows)

但是,一旦我将非数字字符串引入 JSON,COPY 就会停止工作

0\[1,2,"three",4,5]
ERROR:  invalid input syntax for type json
DETAIL:  Token "three" is invalid.
CONTEXT:  JSON data, line 1: [1, 2, three...
COPY test, line 1, column data: "[1, 2, three, 4, 5]"

我无法让 postgres 读取 JSON 格式的非数字字符串。我还尝试将“数据”列的数据类型从 jsonb 更改为 json,并且基本上使用单引号和双引号的每种组合

有人可以帮我找出问题吗?谢谢

标签: postgresqlcsv

解决方案


因为您的文件是 CSV 编码的,所以它并不代表您的想法。

0\"a string"

使用 this 的分隔符\是两个值:数字 0 和字符串a string。请注意缺少引号。这些引号是 CSV 字符串格式的一部分。a string不是有效的 JSON,引号是必需的。

相反,您需要在 CSV 字符串引号内包含 JSON 字符串引号。CSV 中的引号通过加倍来转义。

0\"""a string"""

现在是数字 0 和"a string"包含引号的字符串。

作为观察,消除将 JSON 嵌入 CSV 并使用纯 JSON 文件的复杂性会更简单。

[
  [0, "a string"],
  [1, "other string"]
]

推荐阅读