PostgreSQL:使用COPY命令导入以|结尾的文本文件报错求解决方案
嘿,这个问题我之前处理过好多次!其实不用提前修改文件,PostgreSQL的COPY命令本身就有办法直接解决这种每行末尾带分隔符的情况,分两种情况给你说:
如果你用的是PostgreSQL 12及以上版本(强烈推荐)
直接用IGNORE_EXTRA_DATA参数就行,它专门用来处理这种“每行字段数比表列数多”的情况,会自动忽略多余的部分,不会抛出extra data after last expected column错误。
举个实际的例子,假设你的目标表是user_data,有id, name, email三列,要导入的文件路径是/server/files/user_data.txt,那COPY语句可以这么写:
COPY user_data FROM '/server/files/user_data.txt' WITH ( DELIMITER '|', FORMAT text, NULL '', IGNORE_EXTRA_DATA );
或者如果你习惯用CSV格式解析的话,把FORMAT text换成FORMAT csv就行,效果一样。
如果你用的是PostgreSQL 12以下的老版本
那可以借助临时表中转一下:
- 先创建一个临时表,比你的目标表多一列,用来接收末尾分隔符带来的空值:
CREATE TEMP TABLE temp_user_data (id int, name text, email text, dummy_col text);
- 把数据导入到临时表:
COPY temp_user_data FROM '/server/files/user_data.txt' WITH (DELIMITER '|', NULL '');
- 把需要的字段插入到目标表,忽略那个多余的列:
INSERT INTO user_data (id, name, email) SELECT id, name, email FROM temp_user_data;
- 用完临时表可以删掉:
DROP TABLE temp_user_data;
两种方法都能避免修改源文件,直接用PostgreSQL的命令搞定,第一种更简洁高效~
内容的提问来源于stack exchange,提问作者Nagendra Putti
相关产品推荐
相关产品推荐

