duck <- DBI::dbConnect(duckdb::duckdb())
writeLines(c('a,b,d', '1,"Boticas MiCasa" RSL,3'), "fake.csv")
duckdb::duckdb_read_csv(duck, "faketable", "fake.csv")
# Error: rapi_execute: Failed to run query
# Error: Invalid Input Error: Error in file "/home/r2/fake.csv" on line 2: quote should be followed by end of value, end of row or another quote. ( file=/home/r2/fake.csv
# delimiter=','
# quote='"'
# escape='"' (default)
# header=1
# sample_size=20480
# ignore_errors=0
# all_varchar=0).
duckdb::duckdb_read_csv(duck, "faketable", "fake.csv", quote="")
DBI::dbGetQuery(duck, "select * from faketable")
# a b d
# 1 1 "Boticas MiCasa" RSL 3
# normal
read.csv(text='a,b,d\n"1",2,3\n"4",5,6')
# a b d
# 1 1 2 3
# 2 4 5 6
read.csv(text='a,b,d\n"1",2,3\n"4,5,6')
# Error in read.table(file = file, header = header, sep = sep, quote = quote, :
# incomplete final line found by readTableHeader on 'text'
我们可以通过添加quote=""来禁用引号的处理,并查看有问题的行:
read.csv(text='a,b,d\n"1",2,3\n"4,5,6', quote="")
# a b d
# 1 "1" 2 3
# 2 "4 5 6
我们可以使用这个管道清理好的("1")和坏的("4)字符串:
read.csv(text='a,b,d\n"1",2,3\n"4,5,6', quote="") |>
lapply(function(z) if (is.character(z)) type.convert(gsub(r"(^['"]|['"]$)", "", z), as.is=TRUE) else z) |>
as.data.frame()
# a b d
# 1 1 2 3
# 2 4 5 6
1条答案
按热度按时间ftf50wuq1#
编辑:长话短说,
duckdb_read_csv
需要quote=""
,就像read.csv
在前面的答案中一样(保留,下面)。您可能仍然需要考虑一些修复步骤,以删除现在可能由此保留的其他引用。Reprex:
只是一个想法,以帮助故障排除,不确定它会工作。
当错误与报价有关时,您可以关闭报价流程并重试。这将导致在整个数据中使用引号,但(1)这些很容易删除,(2)至少您可以看到问题所在。
不幸的是...如果数据在字符串中嵌入了逗号(这将使用引号 required),那么这将不起作用。
演示:
我们可以通过添加
quote=""
来禁用引号的处理,并查看有问题的行:我们可以使用这个管道清理好的(
"1"
)和坏的("4
)字符串:如果您有嵌入式引号(需要CSV的双引号转义,如
"hello ""world"" again"
,那么您需要在清理中的另一个步骤来处理这些中间引号。