如何在用RSQLite导入csv文件时忽略带引号字符串中的分隔符?

mftmpeh8  于 2023-01-21  发布在  SQLite
关注(0)|答案(1)|浏览(117)

我想导入一个csv文件,其结构与下面的示例类似:

var1;var2;var3
"a";1;"Some text"
"b";0;"More text"
"c;0;"Delimiter in ; middle of the text"

传统的解析器(如data.table::fread使用的解析器)在默认情况下会处理这些数据,我想使用RSQLite::dbWriteTable将这些数据导入SQLite数据库。

con <- DBI::dbConnect(RSQLite::SQLite(), dbname = "mydb.sqlite")
dbWriteTable(conn = con, name = "my_table", value = "data_file.csv")

dbWriteTable中没有提供引号的选项,因此当发现有问题的行时,函数会抛出一个错误。我该如何导入这些数据?唯一的限制是,在导入SQLite之前,我没有足够的内存来使用R解析数据。

dgenwo3n

dgenwo3n1#

安装Windows和Linux平台上可用的csvfix实用程序,然后尝试此测试代码。它在Windows上对我有效。您可能需要为其他平台稍微调整一下,特别是shell行和eol=参数,您可能不需要它们,也可能需要其他值。我们使用csvfix删除引号,并将字段中没有的分号替换为@,然后在阅读时使用@分隔符。
首先,我们创建测试数据。

# if (file.exists("mydb")) file.remove("mydb")
# if (file.exists("data_file2.csv")) file.remove("data_file2.csv")

# write out test file
cat('var1;var2;var3\n"a";1;"Some text"\n"b";0;"More text"\n"c";0;"Delimiter in ; middle of the text"', file = "data_file.csv")

# create database (can omit if it exists)
cat(file = "mydb")

csv修复

现在使用csvfix处理数据文件

library(RSQLite)

# preprocess file using csvfix - modify next line as needed depending on platform
shell("csvfix write_dsv -sep ; -s @ data_file.csv > data_file2.csv")
file.show("data_file2.csv") # omit this line for real data

# write file to database
con <- dbConnect(SQLite(), "mydb")
dbWriteTable(con, "myFile", "data_file2.csv", sep = "@", eol = "\r\n")
dbGetQuery(con, "select * from myFile") # omit this line for real data
dbDisconnect(con)

xsv

或者安装xsvreleases)rust实用程序。这在Windows上对我有效。

library(RSQLite)

shell("xsv fmt -d ; -t @ data_file.csv > data_file2.csv")
file.show("data_file2.csv") # omit this line for real data

# write file to database
con <- dbConnect(SQLite(), "mydb")
dbWriteTable(con, "myFile", "data_file2.csv", sep = "@")
dbGetQuery(con, "select * from myFile") # omit this line for real data
dbDisconnect(con)

相关问题