【发布时间】:2017-12-21 18:23:16
【问题描述】:
我正在尝试使用 RSQLite 包(我也尝试过 sqldf 包)将大型 csv 文件加载到 SQL lite 数据库中。该文件包含所有英国邮政编码及其各种查找值。
我想避免将其加载到 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")
遇到这个问题后,我找到了推荐使用 sqldf 包的参考教程 (https://www.r-bloggers.com/r-and-sqlite-part-1/),但不幸的是,当我尝试在 sqldf (read.csv.sql) 中使用相关函数时,我遇到了同样的问题双引号。
当将 csv 文件导入 sql 系统时,这感觉是一个相当普遍的问题,大多数导入工具都能够处理双引号,所以我很惊讶遇到这个问题(除非我错过了一个明显的帮助文件途中某个地方的问题)。
编辑 1
以下是我的 csv 文件中的一些示例数据,以 SQL 表的 dput 输出形式:
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 函数中使用 filter 参数的尝试(请注意,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 范围内的编程问题的人的密切投票(?!)。
【问题讨论】:
-
请参阅 sqldf github 页面上的常见问题解答 #13。还有
read.csv.sql的帮助文件请查看minimal reproducible example。 -
谢谢,我会在安装 rtools 后尝试常见问题解答建议。你能指出我的例子需要改进的地方吗?
-
在问题中显示一小部分输入行以使其独立,或者如果它们很长,则将它们缩短到足以保持主要思想而不会因大量数据而使问题超载。
-
等我有空的时候再补充。我刚刚尝试了常见问题解答中的建议,但仍然没有运气:utils::read.table 中的错误(value,sep = sep,header = header,skip = skip,:rsqlite_send_query 中的错误输入中没有可用的行(conn@ ptr,语句):没有这样的表:文件
标签: r sqlite csv sqldf rsqlite