Я пытаюсь загрузить файл csv большого размера в базу данных SQL lite с помощью пакета RSQLite (я также пробовал пакет sqldf). Файл содержит все почтовые индексы Великобритании и различные поисковые значения для них.
Я хотел не загружать его в R, а просто загружать напрямую в базу данных. Хотя это не является строго необходимым для этой задачи, я хочу сделать это, чтобы подготовить методику для больших файлов, которые не поместятся в памяти, если мне придется обрабатывать их в будущем.
К сожалению, csv предоставляет значения в двойных кавычках, и функция dbWriteTable, похоже, не может разделить их или игнорировать их в любой форме. Вот место загрузки файла: http://ons.maps.arcgis.com/home/item.html?id=3548d835cff740de83b527429fe23ee0
Вот мой код:
# Load library
library("RSQLite")
# Create a temporary directory
tmpdir <- tempdir()
# Set the file name
file <- "data\\ONSPD_MAY_2017_UK.zip"
# Unzip the ONS Postcode Data file
unzip(file, exdir = tmpdir )
# Create a path pointing at the unzipped csv file
ONSPD_path <- paste0(tmpdir,"\\ONSPD_MAY_2017_UK.csv")
# Create a SQL Lite database connection
db_connection <- dbConnect(SQLite(), dbname="ons_lkp_db")
# Now load the data into our SQL lite database
dbWriteTable(conn = db_connection,
name = "ONS_PD",
value = ONSPD_path,
row.names = FALSE,
header = TRUE,
overwrite = TRUE
)
# Check the data upload
dbListTables(db_connection)
dbGetQuery(db_connection,"SELECT pcd, pcd2, pcds from ONS_PD LIMIT 20")
Решив эту проблему, я нашел справочное руководство (https://www.r-bloggers.com/r-and-sqlite-part-1/), который рекомендовал использовать пакет sqldf, но, к сожалению, когда я пытаюсь использовать соответствующую функцию в sqldf (read.csv.sql), я получить ту же проблему с двойными кавычками.
Это похоже на довольно распространенную проблему при импорте файлов csv в систему sql, большинство инструментов импорта могут обрабатывать двойные кавычки, поэтому я удивлен, что столкнулся с проблемой с этим (если только я не пропустил очевидный файл справки по проблеме где-то по пути).
ИЗМЕНИТЬ 1
Вот несколько примеров данных из моего файла csv в виде вывода dput таблицы SQL:
structure(list(pcd = c("\"AB1 0AA\"", "\"AB1 0AB\"", "\"AB1 0AD\"",
"\"AB1 0AE\"", "\"AB1 0AF\""), pcd2 = c("\"AB1 0AA\"", "\"AB1 0AB\"",
"\"AB1 0AD\"", "\"AB1 0AE\"", "\"AB1 0AF\""), pcds = c("\"AB1 0AA\"",
"\"AB1 0AB\"", "\"AB1 0AD\"", "\"AB1 0AE\"", "\"AB1 0AF\"")), .Names = c("pcd",
"pcd2", "pcds"), class = "data.frame", row.names = c(NA, -5L))
ИЗМЕНИТЬ 2
Вот моя попытка использовать аргумент фильтра в функции sqldf read.csv.sql (обратите внимание, что пользователям Windows потребуется rtools, установленный для этого). К сожалению, это все еще не удаляет кавычки из моих данных, хотя таинственным образом удаляет все пробелы.
library("sqldf")
sqldf("attach 'ons_lkp_db' as new")
db_connection <- dbConnect(SQLite(), dbname="ons_lkp_db")
read.csv.sql(ONSPD_path,
sql = "CREATE TABLE ONS_PD AS SELECT * FROM file",
dbname = "ons_lkp_db",
filter = 'tr.exe -d ^"'
)
dbGetQuery(db_connection,"SELECT pcd, pcd2, pcds from ONS_PD LIMIT 5")
Кроме того, спасибо за тщательное голосование от тех, кто считал, что это не вопрос программирования в рамках Stack Overflow (?!).
read.csv.sql
. Просмотрите минимальный воспроизводимый пример. - person G. Grothendieck   schedule 17.07.2017^"
. Также прочтите минимальный воспроизводимый пример. - person G. Grothendieck   schedule 24.07.2017