Как игнорировать разделители внутри строк в кавычках при импорте CSV-файла с помощью RSQLite?

Я хочу импортировать CSV-файл, структура которого аналогична приведенному ниже примеру:

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

Традиционные синтаксические анализаторы, такие как тот, который использует data.table::fread, имеют дело с этим по умолчанию. Я хочу импортировать эти данные в базу данных SQLite с помощью RSQLite::dbWriteTable.

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

В dbWriteTable нет возможности предоставлять кавычки, поэтому функция выдает ошибку при обнаружении проблемной строки. Как я могу импортировать эти данные? Единственное ограничение, которое у меня есть, заключается в том, что у меня недостаточно памяти для анализа данных с помощью R перед импортом в SQLite.


person Nícolas Pinto    schedule 26.08.2019    source источник


Ответы (1)


Установите утилиту csvfix, доступную на платформах Windows и Linux, а затем попробуйте этот тестовый код. Это работало для меня в 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")

csvfix

Теперь обработайте файл данных с помощью 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

В качестве альтернативы установите утилиту для ржавчины xsv. Это сработало для меня в 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)
person G. Grothendieck    schedule 26.08.2019