【问题标题】:Merging multiple ACCESS files in R在 R 中合并多个 ACCESS 文件
【发布时间】:2016-04-05 21:17:46
【问题描述】:

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

【问题讨论】:

  • 听起来你的错误是文件存在。访问文件很挑剔,他们喜欢通过 R-32 位进行连接。同样取决于文件,odbcConnectAccess2007可能会更好地为您服务。值得注意的是,我的经验是使用 .accdb 文件,不确定它们的行为是否不同。旁注,您的查询看起来不错,如果您要抓取整张桌子,可以使用sqlFetch,我发现它要快一些。
  • This 也可能有帮助,它只是从包 Hmisc 中提取 mdb 表。
  • @Badger - 我尝试安装 mdb-tools 包,因为它看起来对于 Hmisc 是必需的,但出现错误,即“mdb-tools”不适用于 R 版本 3.2.3。不知道应该怎么做才能解决这个问题。

标签: r


【解决方案1】:

作为像 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)

【讨论】:

  • @Parfait-我非常感谢你。脚本运行没有任何错误。我不确定我做错了什么。你能解释一下我的脚本的问题吗?如果没有,我理解。再次感谢您!
  • 如果我理解这是因为您根据博客替换了 .mdb(文件扩展名),但是系统需要带扩展名的全名才能连接到数据库!
  • 正确@Badger。 OP 删除了扩展,如果包含子目录,则可能为某些文件粘贴了不正确的路径。所以只需使用full.names。此外,非 mdb 文件将被传递到 odbc 连接中。
猜你喜欢
  • 2012-04-29
  • 1970-01-01
  • 1970-01-01
  • 2014-01-07
  • 2015-07-26
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多