尝试将 csv 文件导入 postgresql 时出现“最后一个预期列后的额外数据”

问题描述 投票:0回答:7

我尝试将 CSV 文件的内容复制到我的 postgresql 数据库中,但收到此错误“最后一个预期列后有额外数据”。

我的 CSV 内容是

    agency_id,agency_name,agency_url,agency_timezone,agency_lang,agency_phone
100,RATP (100),http://www.ratp.fr/,CET,,

我的 postgresql 命令是

COPY agency (agency_name, agency_url, agency_timezone) FROM 'myFile.txt' CSV HEADER DELIMITER ',';

这是我的桌子

CREATE TABLE agency (
    agency_id character varying,
    agency_name character varying NOT NULL,
    agency_url character varying NOT NULL,
    agency_timezone character varying NOT NULL,
    agency_lang character varying,
    agency_phone character varying,
    agency_fare_url character varying
);

     Column      |       Type        | Modifiers 
-----------------+-------------------+-----------
 agency_id       | character varying | 
 agency_name     | character varying | not null
 agency_url      | character varying | not null
 agency_timezone | character varying | not null
 agency_lang     | character varying | 
 agency_phone    | character varying | 
 agency_fare_url | character varying | 
postgresql csv postgresql-9.3
7个回答
60
投票

现在您有 7 个字段。

您需要将 CSV 中的这 6 个字段映射到表中的 6 个字段。

当您有 6 个字段时,您不能像以下那样只映射 csv 中的 3 个字段:

\COPY agency (agency_name, agency_url, agency_timezone) FROM 'myFile.txt' CSV HEADER DELIMITER ',';

csv 文件中的所有字段都需要映射到命令的副本中。

并且由于您定义了 csv

,
分隔符是默认的,因此您不需要放置它。


8
投票

不确定这算不算答案,但我只是用一堆 CSV 文件来解决这个问题,发现只需在 Excel 中打开它们并在不进行任何更改的情况下重新保存它们,错误就会消失。 IOTW 源文件中可能存在一些不正确的格式,Excel 能够自动清理这些格式。


2
投票

如果 postgres 表和 csv 文件中的列数相同,即使您在

delimiter ','
命令中指定了
\copy
,也会发生此错误。您还需要指定
CSV

就我而言,我的其中一列包含逗号分隔的数据,我执行:

db=# \copy table1 FROM '/root/db_scripts/input_csv.csv' delimiter ','
ERROR:  invalid input syntax for integer: "id"
CONTEXT:  COPY quiz_quiz, line 1, column id: "id"

添加后成功了

CSV
:

db=# \copy table1 FROM '/root/db_scripts/input_csv.csv' delimiter ',' CSV
COPY 47871

0
投票

对于未来的访问者,当我遇到这个问题时,是因为我在将查询提交到数据库(

context
)之前使用了一个循环写入相同的io.StringsIO()变量。

如果您遇到此问题,请确保您的代码如下所示:

for tableName in tableNames:
    output = io.StringsIO()
    ...
    output.seek(0)
    cur.copy_expert(f"COPY {tableName} FROM STDIN", output)
    conn.commit()

不是这样的:

output = io.StringsIO()

for tableName in tableNames:
    ...
    output.seek(0)
    cur.copy_expert(f"COPY {tableName} FROM STDIN", output)
    conn.commit()

0
投票

我可以通过删除标题上的空列来修复它。 你在 Excel 中看不到它,所以你必须使用 vscode。

删除最后一个列标题后多余的逗号,一切就OK了。


-1
投票

我尝试了你的例子,它工作正常,但是......

psql 命令行中的命令丢失了

\

database=#  \COPY agency FROM 'myFile.txt' CSV HEADER DELIMITER ',';

下次请包括

DDL

我从 csv 标题创建了

DDL


-1
投票

我刚刚遇到了这个错误,我花了 3 天才找到一个甚至在 YouTube 上都没有的解决方案。 这是最好的方法 1 将 csv 文件插入(复制)到新文件夹中,然后通过右键单击并选择属性和安全性来授予“Everyone”访问权限。 2 在您授予Everyone访问权限后,下一步是将包含您的csv文件的文件夹复制到[program file > postgresql > 14 > data],然后返回使用复制表命令而不是插入表选项。 您的程序文件位于您的 PC 中,您只需找到它的位置,然后查找 postgresql 文件夹。 保重。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.