如何将每行是JSON的CSV文件导入PostgreSQL临时表?
解决含转义双引号的JSON行导入PostgreSQL临时表问题
针对你遇到的JSON行导入错误,以下两种方案可以解决问题:
方案一:使用TEXT格式导入(推荐)
因为你的文件每行是完整的JSON字符串,直接使用TEXT格式导入是最稳妥的方式——PostgreSQL会将每行内容作为单个jsonb字段的值处理,不会解析行内的逗号、双引号作为分隔符。
对应的COPY命令:
COPY temp_table(json_rec) FROM STDIN WITH (FORMAT TEXT);
在使用copyIn方法时,直接将文件的每行内容逐行写入即可。这种方式会自动忽略JSON内部的转义双引号,因为PostgreSQL会把整行当作合法的JSON字符串去解析,完全适配你提供的示例行格式。
方案二:配置CSV格式的正确参数
如果必须使用CSV模式,需要修改QUOTE和ESCAPE参数,避免PostgreSQL误将JSON内部的双引号识别为CSV字段的引号:
COPY temp_table(json_rec) FROM STDIN WITH (FORMAT CSV, QUOTE E'\x00', ESCAPE '\');
QUOTE E'\x00':将CSV的引号字符设置为空字符(不会出现在你的JSON内容中),彻底避免干扰JSON内部的双引号。ESCAPE '\':指定反斜杠为转义字符,让PostgreSQL正确识别JSON里的转义双引号(比如\"会被解析为")。
注意事项
- 确保文件中每行都是语法有效的JSON,如果存在残缺的JSON(比如缺失闭合括号、逗号错误),仍会触发解析错误。
- 临时表的
jsonb类型比json更适合后续的查询、索引操作,保持当前表定义即可。 - 使用
copyIn时,要保证写入的内容每行结尾带有正确的换行符,PostgreSQL依赖换行分割每条记录。
内容的提问来源于stack exchange,提问作者GaripTipici
相关产品推荐
相关产品推荐

