我在MS Access中大约有100行,每行都包含一个附件。在RI中使用RODBC可以访问表,但不知道如何访问附件文件并在R中下载它们
你能帮我怎么做吗
MS Access中的附件是特殊的数据类型,实际上涉及嵌套表以获取元数据(文件名和文件数据)信息。因此,您不能仅通过RODBC使用DML SQL语句访问此数据,而可以使用COM接口,特别是连接到DAO SaveToFile()方法。
请考虑以下使用RDCOMClient
允许与Access Object Library进行接口连接的包的方法。请注意:为了运行以下代码,您必须安装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()
对于多个附件,请遍历每个文件名和文件数据值的子记录集(请注意不同的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()
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句