You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将包含JSON的CSV文件导入PostgreSQL?解决导入结果行数不符的问题

解决PostgreSQL导入CSV时拆分单行内容为多行的问题

你遇到的核心问题是CSV文件内容是单行结构(HEADER + 两个带引号的JSON字符串),而默认的\copy命令按行分割记录,所以直接导入会把整行当成单条记录。下面给你两种实用的解决方案:

方法一:导入后拆分已有记录

如果已经执行初始\copy导入了整行数据,可以通过SQL语句快速拆分出预期的两行记录:

  1. 拆分原记录并插入新行:
INSERT INTO my_table(my_text)
SELECT unnest(string_to_array(
    -- 提取HEADER后的内容,去掉首尾双引号,再按" "(引号+空格)分割为数组
    trim(substring(my_text from 'HEADER (.*)$'), '"'),
    '" "'
))
FROM my_table
WHERE my_text LIKE 'HEADER%';
  1. 删除原始的整行记录:
DELETE FROM my_table WHERE my_text LIKE 'HEADER%';

方法二:导入时直接预处理文件(推荐)

如果不想先导入再调整,可利用PostgreSQL的\copy ... FROM PROGRAM选项,用命令行工具预处理CSV文件,直接生成两行记录后导入:

\copy my_table(my_text) FROM PROGRAM 'sed ''s/^HEADER //; s/" "/\n/g'' my_file.csv'

这个命令的作用拆解:

  • sed ''s/^HEADER //'':移除行首的HEADER 前缀
  • s/" "/\n/g:把两个JSON之间的" "(引号+空格)替换成换行符,将单行拆分为两行
  • 处理后的内容直接被\copy读取,自动导入为两条独立记录

补充说明

你的CSV里的""是CSV格式对双引号的转义写法,\copy默认会自动将""解析为单个"。如果需要保留字面的"",可以在命令中添加ESCAPE ''''参数禁用双引号转义:

\copy my_table(my_text) FROM PROGRAM 'sed ''s/^HEADER //; s/" "/\n/g'' my_file.csv' WITH (ESCAPE '''');

内容的提问来源于stack exchange,提问作者maxime.b28

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 21:47:41