【问题标题】:ERROR: extra data after last expected column - COPY错误:最后一个预期列之后的额外数据 - 复制
【发布时间】:2017-07-25 15:39:12
【问题描述】:

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

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

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

这是我的复制命令:

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|||||

【问题讨论】:

  • 最后一个分隔符后面什么都没有?那里应该有一些预期的数据吗?你能告诉我们你正在加载的表格吗?
  • @rajkumars - 您应该编辑您的帖子,而不是将所有内容粘贴到评论中。我添加了您的表格 DDL 以及一些格式,但没有复制您的数据,因为它被截断了,我不想歪曲它。但是,如果不是敏感信息,您应该使用文件中的一两行来更新您的问题。
  • public.table 是如何定义的?它有多少列?
  • @LaurenzAlbe 早些时候刚刚给出了示例复制命令。现在我已经正确更改,我已经提到了我的测试数据和表格列在下面的外观
  • @rajkumars - 现在我正在查看“相关”下右侧的 9 个问题,它们都在问同样的问题。您是否阅读过其中任何一个以查看是否提到了您的解决方案?

标签: postgresql


【解决方案1】:

省略阻尼数据中的空行,我会收到一条与 9.6 不同的错误消息:

ERROR:  unterminated CSV quoted field
CONTEXT:  COPY dimingredient, line 3: "5145|2016-07-01 13:34:25.1001891|1900-01-01 00:00:00.0000000|9999-12-31 23:59:59.9999999|True|93834|..."

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

错误信息很容易解释:第二行有奇数个引号字符(")。

由于带引号的字符串中的两个双引号被解释为一个双引号(" 被转义为 ""),因此第二行中的字段是:

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 或引用该字段并将" 加倍。

【讨论】:

  • 我厌倦了它无法正常工作的所有方式。我需要所有字段而不删除任何字段,因为我的数据有英尺和英寸。
  • “我尝试了所有方法,但它不起作用”几乎没有继续下去。您应该扩展问题并准确显示您尝试的内容以及您收到的确切信息。还有一个未解决的问题,即没有任何版本的 PostgreSQL 会产生您报告的错误消息以及您在问题中显示的数据。
猜你喜欢
  • 1970-01-01
  • 2021-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-15
  • 1970-01-01
  • 2019-06-15
相关资源
最近更新 更多