如何使用 R 下载所有 MS 访问附件
how to download all MS access attachments using R
我在 MS Access 中有大约 100 行,每行都包含一个附件。在 R 中使用 RODBC 我可以访问 table 但不知道如何访问附件并在 R
中下载它们
你能帮我看看怎么做吗
MS Access 中的附件是特殊数据类型,实际上涉及元数据(文件名和文件数据)信息的嵌套 table。因此,您不能通过 RODBC 单独使用 DML SQL 语句访问此数据,但可以使用 COM 接口,特别是连接到 DAO SaveToFile() 方法。
考虑以下使用 RDCOMClient
包的情况,它允许连接到 Access Object Library。请注意:为了 运行 下面的代码,您必须安装 MSAccess.exe (MS Office GUI 程序)而不仅仅是 .accdb 文件。在下面的 SQL 查询中,ColAttach 是 table 中附件字段的名称,您必须使用这些限定符 .filedata 和 .文件名。 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()
对于多个附件,在每个 filename 和 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()
}
我在 MS Access 中有大约 100 行,每行都包含一个附件。在 R 中使用 RODBC 我可以访问 table 但不知道如何访问附件并在 R
中下载它们你能帮我看看怎么做吗
MS Access 中的附件是特殊数据类型,实际上涉及元数据(文件名和文件数据)信息的嵌套 table。因此,您不能通过 RODBC 单独使用 DML SQL 语句访问此数据,但可以使用 COM 接口,特别是连接到 DAO SaveToFile() 方法。
考虑以下使用 RDCOMClient
包的情况,它允许连接到 Access Object Library。请注意:为了 运行 下面的代码,您必须安装 MSAccess.exe (MS Office GUI 程序)而不仅仅是 .accdb 文件。在下面的 SQL 查询中,ColAttach 是 table 中附件字段的名称,您必须使用这些限定符 .filedata 和 .文件名。 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()
对于多个附件,在每个 filename 和 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()
}