csv 引号后面应该是值的末尾、行的末尾还是另一个引号?

vql8enpb  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(81)

我试图在R中读取20M记录tsv,但不断收到错误,因为显然文件没有正确生成。

  • 但是,对于我们使用的产品,数据始终会上传到Adobe的服务器。它给出了关于值格式不正确的警告,**但它仍然被上传,我们可以使用这些数据。

1.-我如何将数据上传到duckdb而不考虑格式问题?
2.-第1107386行的文件“xxx,csv”中出错。我如何才能只访问那一行(或者前后5行)来查看真正的问题是什么?

ftf50wuq

ftf50wuq1#

编辑:长话短说,duckdb_read_csv需要quote="",就像read.csv在前面的答案中一样(保留,下面)。您可能仍然需要考虑一些修复步骤,以删除现在可能由此保留的其他引用。

Reprex:

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

只是一个想法,以帮助故障排除,不确定它会工作。
当错误与报价有关时,您可以关闭报价流程并重试。这将导致在整个数据中使用引号,但(1)这些很容易删除,(2)至少您可以看到问题所在。
不幸的是...如果数据在字符串中嵌入了逗号(这将使用引号 required),那么这将不起作用。
演示:

# 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

如果您有嵌入式引号(需要CSV的双引号转义,如"hello ""world"" again",那么您需要在清理中的另一个步骤来处理这些中间引号。

相关问题