csv 使用Python将文件加载到DuckDB中失败,因为“/N”值用于表示空值

3gtaxfhh  于 11个月前  发布在  Python
关注(0)|答案(1)|浏览(138)

我试图将一个csv加载到Python中,但是文件总是失败,因为其中一个字段有一个'\N'来表示一个字段中的空值,这个字段是空的。我不知道如何处理这个问题-我想在进来的时候转换它。
如果我可以忽略错误并将其余记录插入表中,那就太好了,但这似乎不是一件事。
任何帮助将不胜感激
下面的代码

con.sql("INSERT INTO getNBBOtimes SELECT * FROM read_csv_auto('G:/temp/timeexport.csv')")

字符串
导致以下错误

InvalidInputException                     Traceback (most recent call last)
<timed eval> in <module>

InvalidInputException: Invalid Input Error: Could not convert string '\N' to INT64 in column "column3", at line 856438.

Parser options:
  file=G:/temp/timeexport.csv
  delimiter=',' (auto detected)
  quote='"' (auto detected)
  escape='"' (auto detected)
  header=0 (auto detected)
  sample_size=20480
  ignore_errors=0
  all_varchar=0.

Consider either increasing the sample size (SAMPLE_SIZE=X [X rows] or SAMPLE_SIZE=-1 [all rows]), or skipping column conversion (ALL_VARCHAR=1)


我想我会尝试处理错误的方式,但似乎没有工作

con.sql("CREATE TABLE test1 as seLECT NULLIF(column1,'\\N') , NULLIF(column2,'\\N'),NULLIF(column3,'\\N'),NULLIF(column4,'\\N'),NULLIF(column2,'\\N') FROM read_csv_auto('G:/temp/timeexport.csv')")


返回以下错误:

SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 46-47: malformed \N character escape


我尝试了这个

con.sql("CREATE TABLE test1 as seLECT NULLIF(column1,repr('\\N')) , NULLIF(column2,repr('\\N')),NULLIF(column3,repr('\\N')),NULLIF(column4,(repr'\\N')),NULLIF(column2,repr('\\N')) FROM read_csv_auto('G:/temp/timeexport.csv')")


得到了这个错误

CatalogException: Catalog Error: Scalar Function with name repr does not exist!
Did you mean "exp"?
5uzkadbs

5uzkadbs1#

您还没有提供任何示例数据,因此我们假设您从以下内容开始:

id,hours_worked
1,8
2,\N
3,10
4,\N

字符串
我们首先创建目标表:

>>> con = duckdb.connect()
>>> con.sql('create table getnbbotimes (id int, hours_worked int64)')


我们可以使用SQL IF语句来读取文件:

>>> con.sql("INSERT INTO getNBBOtimes SELECT id,if(hours_worked == '\\N',NULL,hours_worked) FROM read_csv_auto('timeexport.csv')")


这让我们:

>>> con.sql('select * from getnbbotimes')
┌───────┬──────────────┐
│  id   │ hours_worked │
│ int32 │    int64     │
├───────┼──────────────┤
│     1 │            8 │
│     2 │         NULL │
│     3 │           10 │
│     4 │         NULL │
└───────┴──────────────┘


……我想这就是你想要的。
如果您愿意将所有列都视为VARCHAR,则可以使用NULLIF来实现您的解决方案:

>>> con.sql("CREATE TABLE test1 as select NULLIF(id,'\\N') 
... as id, NULLIF(hours_worked,'\\N') as hours_worked
... FROM read_csv_auto('timeexport.csv', all_varchar=1)")


这让我们:

>>> con.sql('select * from test1')
┌─────────┬──────────────┐
│   id    │ hours_worked │
│ varchar │   varchar    │
├─────────┼──────────────┤
│ 1       │ 8            │
│ 2       │ NULL         │
│ 3       │ 10           │
│ 4       │ NULL         │
└─────────┴──────────────┘

然后,您可以使用第二个select将这些varchar值转换为int64。

相关问题