You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含列表值的CSV批量导入DuckDB?解决导入报错问题

问题描述

我有如下格式的CSV文件:

W123456,{A123,A234,A345}
W2345567,{A789,A678,A543}

我使用以下Python代码尝试加载该CSV文件:

import duckdb
con = duckdb.connect(database='mydb.duckdb', read_only=False)
con.execute('CREATE TABLE mytable(field1 VARCHAR, field2 VARCHAR[])')
con.execute("COPY mytable FROM 'my.csv'")

执行时报错:

Traceback (most recent call last):

File "myfile.py", line 5, in <module>

con.execute("COPY mytable FROM 'my.csv'")

RuntimeError: Invalid Input Error: Error on line 1: expected 2 values per row, but got more. (DELIMITER=',' (default), QUOTE='"' (default), ESCAPE='"' (default), HEADER=0' (default), SAMPLE_SIZE=10240, IGNORE_ERRORS=0, ALL_VARCHAR=0)

我已尝试给列表中的字符串添加引号,但仍未解决问题。请问我忽略了什么要点?

解决方案

问题核心是DuckDB默认CSV解析规则的冲突:

  • 默认会把所有逗号当作字段分隔符,包括{}内部的逗号,导致每行被拆分成多个字段,超出表定义的2个字段数量,触发报错。
  • 若尝试用引号包裹数组字段,必须使用DuckDB默认的双引号,否则解析器不会识别为字段包裹内容。

提供两种有效解决方法:

方法1:指定数组解析参数

直接在COPY命令中配置数组的起始、结束和分隔符,让DuckDB正确识别{}包裹的数组:

con.execute("COPY mytable FROM 'my.csv' (ARRAY_START='{', ARRAY_END='}', ARRAY_DELIMITER=',')")

方法2:用双引号包裹数组字段

修改CSV文件,将数组字段用双引号包裹,确保内部逗号不会被当作字段分隔符:

W123456,"{A123,A234,A345}"
W2345567,"{A789,A678,A543}"

之后再执行原COPY命令即可正常加载。

内容的提问来源于stack exchange,提问作者Sol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 06:54:48