使用PostgreSQL COPY时出现“错误:上一个预期列之后的额外数据
请耐心等待,因为这是我的第一篇文章.
我正在尝试在PostgreSQL-9.2中运行COPY命令,将.txt文件中的制表符分隔表添加到PostgreSQL数据库,例如: COPY raw_data FROM '/home/Projects/TestData/raw_data.txt' WITH (DELIMITER ' '); 我已经使用SQL命令在数据库中创建了一个名为“raw_data”的空表: CREATE TABLE raw_data (); 尝试运行COPY命令时,我不断收到以下错误消息: ERROR: extra data after last expected column CONTEXT: COPY raw_data,line 1: " 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 ..." (这里的数字应该是列标题) 我不确定它是否因为我在创建db表时没有指定表列但是我试图避免手动输入800或列. 对于如何解决这个问题,有任何的建议吗? 以下是.txt文件的示例: 1 2 3 4 5 6 7 8 9 binary1 1 1 0 1 1 1 1 1 1 binary2 1 0 0 1 0 1 1 0 0 binary3 1 0 1 1 1 0 0 1 0 binary4 1 1 1 1 0 1 0 1 0
空表不行.
您需要与导入数据的结构匹配的表.就像是 CREATE TABLE raw_data ( col1 int,col2 int ... ); 您不需要将制表符声明为DELIMITER,因为它是默认值: COPY raw_data FROM '/home/Projects/TestData/raw_data.txt'; 你说800列?在10个案例中的9个案例中,这表明您的设计存在问题.通常你不会有那么多列.无论如何,肯定有一些方法可以半自动创建CREATE TABLE脚本. 自动化 假设简化了原始数据 1 2 3 4 -- first row is meant as "column name" 1 1 0 1 -- tab separated 1 0 0 1 1 0 1 1 定义一个不同的DELIMITER(根本不会出现在导入数据中),并导入到具有单个文本列的临时登台表: CREATE TEMP TABLE tmp_data (raw text); COPY tmp_data FROM '/home/Projects/TestData/raw_data.txt' WITH (DELIMITER '§'); 此查询创建CREATE TABLE脚本: SELECT 'CREATE TABLE tbl (col' || replace (raw,E't',' bool,col') || ' bool)' FROM tmp_data WHERE raw ~~ E'1t2t3t4%'; -- criteria to identify row with col names 返回: CREATE TABLE tbl (col1 bool,col2 bool,col3 bool,col4 bool) 执行(验证有效性后). INSERT INTO tbl SELECT (('(' || replace(replace(replace( raw,'1','t'),'0','f'),',') || ')')::tbl).* FROM tmp_data WHERE raw !~~ E'1t2t3t4%'; -- criteria to exclude row with col names 或者,使用 INSERT INTO tbl SELECT (('(' || translate(raw,E'10t','tf,') || ')')::tbl).* FROM tmp_data WHERE raw !~~ E'1t2t3t4%'; 这会将字符串转换为兼容格式,以将其强制转换为新创建的表类型,然后使用(row).*将其展开. 全部完成. 您可以将所有这些放入plpgsql函数中,但是您需要防止SQL注入.我在SO上发布了一些类似的解决方案.尝试搜索. ->SQLfiddle demo (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |