我在MS Access中有大约100行,每行包含一个附件。在R中使用RODBC我可以访问该表但不知道如何访问附加文件并在R
中下载它们你能帮我怎么做吗
答案 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()
}