如何将包含JSON的CSV文件导入PostgreSQL?解决导入结果行数不符的问题
解决PostgreSQL导入CSV时拆分单行内容为多行的问题
你遇到的核心问题是CSV文件内容是单行结构(HEADER + 两个带引号的JSON字符串),而默认的\copy命令按行分割记录,所以直接导入会把整行当成单条记录。下面给你两种实用的解决方案:
方法一:导入后拆分已有记录
如果已经执行初始\copy导入了整行数据,可以通过SQL语句快速拆分出预期的两行记录:
- 拆分原记录并插入新行:
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%';
- 删除原始的整行记录:
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
相关产品推荐
相关产品推荐

