如何使用R下载所有MS access附件

如何使用R下载所有MS access附件,r,ms-access-2010,R,Ms Access 2010,我在MS Access中有大约100行,每行包括一个附件。在R中使用RODBC,我可以访问该表,但不知道如何访问附加文件并在R中下载它们 你能帮我怎么做吗?MS Access中的附件是特殊的数据类型,实际上涉及元数据(文件名和文件数据)信息的嵌套表。因此,您不能通过RODBC单独使用DML SQL语句访问此数据,但可以使用COM接口,特别是连接到该方法 使用允许与Access对象库接口的RDCOMClient包考虑以下内容。注意:要运行以下代码,必须安装MSAccess.exe(MS Offic

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


你能帮我怎么做吗?MS Access中的附件是特殊的数据类型,实际上涉及元数据(文件名和文件数据)信息的嵌套表。因此,您不能通过RODBC单独使用DML SQL语句访问此数据,但可以使用COM接口,特别是连接到该方法

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

库(RDCOMClient)
#初始化对象

我认为人们对这个问题不公平。我已经很长时间没有使用MS Access了,因此无法帮助您。您可能会在MS access论坛中四处询问,并探索其他脚本语言。只是一个评论:我尝试了类似的方法(在二进制单元格中处理图像),尽管我不记得我在哪里看过,但我花了很多时间,没有找到通过RODBC访问它的方法。不是说这不可能,但如果你的运气和我一样,你可能需要找到另一种机制。我使用RODBC查询二进制数据(图像和其他文件,包括pdf和excel)。这是另一个你可以研究的问题。我只在MS SQL Server中完成了这项工作,因此无法评论这项工作将如何与Access配合使用。非常感谢,这正是我搜索的内容。但是,如果字段包含两个以上的附加文件,则会出现错误。您需要为子记录集运行另一个循环。与“请参见编辑的答案”中所示的VBA相同的逻辑。如果答案有帮助,请接受并确认解决方案。您是最棒的!非常感谢:)太好了!很高兴我能帮忙。请点击旁边的勾号接受答案。这证实了决议。
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()
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()
}