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

bhmjp9jg  于 2022-12-03  发布在  PostgreSQL
关注(0)|答案(5)|浏览(389)

我试图将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 ',';

这是我的table

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

xdyibdwo1#

现在您有7个字段。
您需要将CSV中的这6个字段Map到表中的6个字段。
当您有6个字段时,您不能像在中那样仅从csvMap3个字段:

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

csv文件中的所有字段都需要在copy from命令中Map。
而且由于你定义的csv ,分隔符是default,你不需要把它。

scyqe7ek

scyqe7ek2#

不确定这算不算是答案,但我刚刚用一堆CSV文件找到了这个问题,发现只要在Excel中打开它们,然后重新保存,不做任何更改,错误就消失了。IOTW可能在源文件中有一些不正确的格式,Excel能够自动清理。

5q4ezhmt

5q4ezhmt3#

如果postgres表和csv文件中的列数相同,即使在\copy命令中指定了delimiter ',',也会发生此错误。您还需要指定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
wgxvkvu9

wgxvkvu94#

对于未来的访问者,当我遇到这个问题时,这是因为我使用了一个循环,该循环在将查询提交到数据库(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()
hujrc8aj

hujrc8aj5#

我试过你的例子,效果很好,但是......
psql命令行中的命令缺少\

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

下次请包括DDL
我从csv标题创建了DDL

相关问题