我正在尝试合并不同的ACCESS文件(位于同一文件夹下的不同子文件夹中)。在阅读了不同的博客和人们在这里提出的一些问题之后,我想出了下面的代码。
Parent.Folder<-"D:/Documents/Rwd"
setwd(Parent.Folder)
library(RODBC)
subfolders<-list.dirs(Parent.Folder, recursive = TRUE)[-1]
list_filenames<-list.files(subfolders, recursive = FALSE)
list_filenames<-paste("D:/Documents/Rwd/", list_filenames, sep="")
list_filenames<-sub(".mdb","",list_filenames)
for (file in list_filenames){
if(!exists("data")){
channel<-odbcConnectAccess(file)
data<-sqlQuery(channel,paste("select* from HRESULTS"))
close(channel)
}
if(exists("data")){
channel<-odbcConnectAccess(file)
temp_data<-sqlQuery(channel,paste("select* from HRESULTS"))
data<-rbind(data,temp_data)
rm(temp_data)
close(channel)
}
}
所有表格都采用相同的格式,我的目标是将它们放在一个数据框中。第一个if语句运行正常并给了我一个数据框,其中包含来自第一个文件的数据但在此之后我收到错误“sqlQuery中的错误(通道,粘贴(”从* HRESULTS中选择*“)): 第一个论点不是一个开放的RODBC频道“ 我之前从未使用过ODBC或SQL,所以如果我犯了一个非常明显的错误,我会道歉。任何帮助将不胜感激。谢谢!
答案 0 :(得分:2)
作为像SQLite这样的文件级数据库系统,MS Access文件需要完整路径引用,包括ODBC连接中的扩展。
根据您的需要,请考虑使用list.files参数full.names = TRUE
,然后仅列出可用的访问扩展名列表.mdb或.accdb。最后,考虑使用lapply来增加导入的查询数据表列表,以后可以运行do.call(rbind...)
来连接到最终的数据帧:
Parent.Folder <- "D:/Documents/Rwd"
subfolders <- list.dirs(Parent.Folder, recursive = TRUE)[-1]
list_filenames <- list.files(subfolders, full.names = TRUE, recursive = FALSE)
acc_files <- list_filenames[grep(".mdb|.accdb", list_filenames)]
output <- lapply(acc_files,
function(file) {
channel <- odbcConnectAccess(file)
# ALTERNATIVE CONNECTION
# channel <- odbcDriverConnect(paste0('driver=
# {Microsoft Access Driver (*.mdb, *.accdb)};
# DBQ=', file))
data <- sqlQuery(channel, "select * from HRESULTS")
close(channel)
return(data)
})
data <- do.call(rbind, output)