如何将含列表值的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
相关产品推荐
相关产品推荐

