postgresql - 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,并且基本上使用单引号和双引号的每种组合
有人可以帮我找出问题吗?谢谢
解决方案
因为您的文件是 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"]
]
推荐阅读
- java - 从第二个微调器位置获取字符串值
- javascript - 试图在事件处理程序上实现关闭?错误:未定义
- javascript - 当我将 VIN 号放入另一个单元格时,使用 Make Model 和 Year 填充一个单元格(使用 Google Sheets 和 Google Script 使用 Api Vpic)
- sql - 主键不等于零降低性能
- ruby-on-rails - 具有 Shoulda 和多个范围唯一性的 Rails 未通过测试
- java - Jboss(失踪)家属:[服务 jboss.persistenceunit]
- mysql - 我应该为 mysql 中的软件版本使用什么数据类型?
- apache-spark - Spark2 中的 SQLContext 没有获取更新的配置单元表记录
- node.js - Node.js 应用程序运行错误
- azure - 如何使用 REST API 获取 HPC Pack 2016 中的所有作业?