错误:上一个预期列后的额外数据 - COPY

时间:2017-07-25 15:39:13

标签: postgresql

当我尝试使用分隔符|导入数据时,收到错误:

  

错误:上一个预期列后的额外数据

如果我从下面的示例数据中出现问题的字段中删除双引号或单引号,我可以加载数据,但我的要求是我需要所有数据而不删除任何数据。

这是我的复制命令:

COPY public.dimingredient FROM '/Users//Downloads/archive1/test.txt' 
DELIMITER '|' NULL AS ''  CSV HEADER ESCAPE AS '"'  ;

我的表:

  public.dimingredient
(
    dr_id integer NOT NULL,
    dr_loadtime timestamp(6) without time zone NOT NULL,
    dr_start timestamp(6) without time zone NOT NULL,
    dr_end timestamp(6) without time zone NOT NULL,
    dr_current boolean NOT NULL,
    casnumber character varying(100) COLLATE pg_catalog."default" NOT NULL,
    ingredientname character varying(300) COLLATE pg_catalog."default" NOT NULL,
    matchingstrategy character varying(21) COLLATE pg_catalog."default",
    percentofconfidence double precision,
    disclosurestatus character varying(42) COLLATE pg_catalog."default",
    issand character varying(1) COLLATE pg_catalog."default",
    sandmeshsize character varying(20) COLLATE pg_catalog."default",
    sandquality character varying(20) COLLATE pg_catalog."default",
    isresincoated character varying(1) COLLATE pg_catalog."default",
    isartificial character varying(1) COLLATE pg_catalog."default",
    CONSTRAINT dimingredient_pkey PRIMARY KEY (dr_id)
)

我的数据:

5144|2016-07-01 13:34:25.1001891|1900-01-01 00:00:00.0000000|9999-12-31 23:59:59.9999999|True|93834|"9-octadecenamide,n,n-bis(2-hydroxyethyl)-, (9z)"|"NO CAS MATCH FOUND"||Disclosed|||||

5145|2016-07-01 13:34:25.1001891|1900-01-01 00:00:00.0000000|9999-12-31 23:59:59.9999999|True|93834|"9-octadecenamide,n,n-bis-2(hydroxy-ethyl)-,(z)""|"NO CAS MATCH FOUND"||Disclosed|||||

1 个答案:

答案 0 :(得分:0)

省略你的dample数据中的空行,我得到一个不同的错误信息9.6,即:

"

奇怪的是,自8.0版本中引入了CSV "以来,该错误消息一直存在,所以我想知道您的数据与上面显示的数据有何不同。

错误消息很容易解释:第二行中有一个奇数引号("")。

由于带引号的字符串中的两个加倍引号被解释为单个双引号(5145 2016-07-01 13:34:25.1001891 1900-01-01 00:00:00.0000000 9999-12-31 23:59:59.9999999 True 93834 9-octadecenamide,n,n-bis-2(hydroxy-ethyl)-,(z)"|NO CAS MATCH FOUND||Disclosed||||| 被转义为COPY),因此第二行中的字段为:

"

...然后"在解析带引号的字符串时命中文件的末尾。因此错误。

解决方案是每个字段使用偶数QUOTE个字符。

如果字段中需要"个字符,请选择其他{{1}}或引用该字段,然后将{{1}}加倍。