r - 使用带有引号的值的 RSQLite 加载数据

标签 r sqlite csv sqldf rsqlite

我正在尝试使用 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")

遇到这个问题后,我找到了一个引用教程(https://www.r-bloggers.com/r-and-sqlite-part-1/),建议使用sqldf包,但不幸的是,当我尝试在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 函数中使用过滤器参数的尝试(请注意,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 范围内的编程问题的人的密切投票(?!)。

最佳答案

RSQLite 中的 CSV 导入器包源自 sqlite3 shell,它本身在导入 CSV 文件( How to import load a .sql or .csv file into SQLite?doc )时似乎不提供对带引号的值的支持。您可以使用readr::read_delim_chunked() :

callback <- function(data) {
  name <- "ONS_PD"
  exists <- dbExistsTable(con, name)
  dbWriteTable(con, name, data, append = exists)
}

readr::read_delim_chunked(ONSPD_path, callback, ...)

替代...以及 CSV 文件所需的任何额外参数。

关于r - 使用带有引号的值的 RSQLite 加载数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45140429/

相关文章:

r - 将极坐标直方图与极坐标散点图相结合

c - 从文件 (CSV) c 中高效读取和复制数据/字符串

mysql - MariaDB : convert string to int when importing from CSV, 同时删除数字中的空格

r - 从特定存储库制作 apt 安装包

基于 adjustmentOHLC() 和 Ad() 的 R Quantmod 年度返回差异

r - 如何在 R 中将完整日期字符转换为 mm/dd/yyyy?

objective-c - NSUserDefaults 与 sqlite3

sql - Nodejs 本地主机不断加载我的函数

android - 加入多对一,但显示为一个结果

excel - Hive 查询结果到 XL