如何使用R

时间:2016-10-14 23:04:37

标签: r ms-access-2010

我在MS Access中有大约100行,每行包含一个附件。在R中使用RODBC我可以访问该表但不知道如何访问附加文件并在R

中下载它们

你能帮我怎么做吗

1 个答案:

答案 0 :(得分:0)

MS Access中的附件是特殊数据类型,实际上涉及元数据(文件名和文本数据库)信息的嵌套表。因此,您无法通过RODBC单独使用DML SQL语句访问此数据,但可以使用COM接口,特别是连接到DAO SaveToFile()方法。

使用允许与Access对象库接口的RDCOMClient包考虑以下内容。请注意:要运行以下代码,您必须安装MSAccess.exe(MS Office GUI程序),而不仅仅是.accdb文件。在下面的SQL查询中, ColAttach 是表中附件字段的名称,您必须使用这些限定符 .filedata .filename 。 DAO记录集字段编号基于零(因此为0和1)。

library(RDCOMClient)

# INITIALIZING OBJECTS
accApp <- COMCreate("Access.Application")
accApp$OpenCurrentDatabase("C:\\Path\\To\\Database.accdb")
docmd <-  accApp[["DoCmd"]]
db <- accApp$CurrentDb()

rst <- db$OpenRecordset("SELECT ColAttach.filedata, ColAttach.filename FROM TblAttach")

while(rst$EOF() == FALSE){     
  rst$Fields(0)$SaveToFile(paste0("C:\\Path\\To\\Output_", rst$Fields(1)$Value()))      
  rst$MoveNext()
}

# CLOSING OBJECTS
rst$close()
docmd$CloseDatabase()
accApp$Quit()

# RELEASING RESOURCES
accApp <- db <- docmd <- rst <- NULL    
rm(rst, db, accApp)
gc()

对于多个附件,在每个文件名 filedata 值上循环访问子记录集(注意不同的SQL)。请务必检查文件是否存在并相应地销毁,否则您将收到COM错误:

rst <- db$OpenRecordset("SELECT ID, ColAttach FROM TblAttach")

while(rst$EOF() == FALSE){    
  childRS <- rst[['ColAttach']]$Value()

  while(childRS$EOF() == FALSE){
    if (file.exists(paste0("C:\\Path\\To\\Output_", childRS[["filename"]]$Value()))) {
      unlink(paste0("C:\\Path\\To\\Output_", childRS[["filename"]]$Value()))
    }

    childRS[["filedata"]]$SaveToFile(paste0("C:\\Path\\To\\Output_", 
                                     childRS[["filename"]]$Value()))
    childRS$MoveNext()
  }

  rst$MoveNext()
}