合并R中的多个ACCESS文件

时间:2016-04-05 21:17:47

标签: r

我正在尝试合并不同的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,所以如果我犯了一个非常明显的错误,我会道歉。任何帮助将不胜感激。谢谢!

1 个答案:

答案 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)