使用PostgreSQL COPY时出现“错误:上一个预期列之后的额外数据”

使用PostgreSQL COPY时出现“错误:上一个预期列之后的额外数据”,第1张

概述请耐心等待,因为这是我的第一篇文章. 我正在尝试在PostgreSQL-9.2中运行COPY命令,将.txt文件中的制表符分隔表添加到PostgreSQL数据库,例如: COPY raw_data FROM '/home/Projects/TestData/raw_data.txt' WITH (DELIMITER ' '); 我已经使用SQL命令在数据库中创建了一个名为“raw_data”的空表 请耐心等待,因为这是我的第一篇文章.

我正在尝试在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 columnCONTEXT:  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   9binary1 1   1   0   1   1   1   1   1   1binary2 1   0   0   1   0   1   1   0   0binary3 1   0   1   1   1   0   0   1   0binary4 1   1   1   1   0   1   0   1   0
空表不行.
       CREATE table raw_data ();   

您需要与导入数据的结构匹配的表.就像是

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 separated1   0   0   11   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_dataWHERE  raw ~~ E'1\t2\t3\t4%';   -- criteria to IDentify row with col names

返回:

CREATE table tbl (col1 bool,col2 bool,col3 bool,col4 bool)

执行(验证有效性后).
然后使用此查询INSERT数据:

INSERT INTO tblSELECT (('(' || replace(replace(replace(                  raw,'1','t'),'0','f'),',')             || ')')::tbl).*FROM   tmp_dataWHERE  raw !~~ E'1\t2\t3\t4%';  -- criteria to exclude row with col names

或者,使用translate()更短/更快:

INSERT INTO tblSELECT (('(' || translate(raw,E'10\t','tf,') || ')')::tbl).*FROM   tmp_dataWHERE  raw !~~ E'1\t2\t3\t4%';

这会将字符串转换为兼容格式,以将其强制转换为新创建的表类型,然后使用(row).*将其展开.

全部完成.

您可以将所有这些放入plpgsql函数中,但是您需要防止sql注入.我在SO上发布了一些类似的解决方案.尝试搜索.
我将不得不留下四件事来解决……

->SQLfiddle demo

总结

以上是内存溢出为你收集整理的使用PostgreSQL COPY时出现“错误:上一个预期列之后的额外数据”全部内容,希望文章能够帮你解决使用PostgreSQL COPY时出现“错误:上一个预期列之后的额外数据”所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1181354.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存