2016-10-14 10 views
-6

MS Accessには100行程度あり、各行には添付ファイルが含まれています。 RIでRODBCを使用すると、テーブルにアクセスができますが、MS AccessでそれをRを使用してすべてのMSアクセス添付ファイルをダウンロードする方法

+0

私はこの質問に不公平です。私は長い間、MS Accessを使用していないので、これであなたを助けることはできません。 MSのアクセスフォーラムで尋ねたり、他のスクリプト言語を調べたりするかもしれません。 –

+0

ちょうどコメント:同様のこと(バイナリセルの画像を扱う)を試してみましたが、私が見た場所を思い出すことはありませんでしたが、多くの時間を費やしてRODBCを通してアクセスする方法が見つけられませんでした。あなたの運が私のようなものなら、あなたは別の仕組みを見つける必要があるかもしれません。 – r2evans

+0

私は、RODBCを使用してバイナリデータ(画像やpdfやExcelを含む他のファイル)を照会しています。あなたが勉強できる別の質問があります。 http://stackoverflow.com/questions/39581256/r-help-data-from-odbc-blob-not-matching-return-from-sql-query/39593187#39593187私はこれをMS SQL Serverでのみ行っています。これがAccessでどのように動作するかについてはコメントできません。 – Benjamin

答えて

0

添付ファイルを実行する方法を私を助けてplzは可能性がどのように添付ファイルにアクセスし、R

でそれらをダウンロードするには考えていることができ、実際に関与する特殊なデータ型ですメタデータ(filenameとfiledata)情報のネストした表したがって、RODBC経由でDML SQL文だけでこのデータにアクセスすることはできませんが、具体的にはDAO SaveToFile()メソッドに接続するCOMインターフェイスを使用できます。

RDCOMClientパッケージを使用して、アクセスオブジェクトライブラリへのインターフェイスを可能にすることを検討してください。注意:以下のコードを実行するには、.accdbファイルだけでなく、MSAccess.exe(MS Office GUIプログラム)がインストールされている必要があります。次のSQLクエリでは、ColAttachはテーブルの添付ファイルフィールドの名前であり、これらの修飾子は.filesataおよび.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() 
} 
+0

ありがとう、私が検索しただけでした。ただし、フィールドに2つ以上の添付ファイルが含まれている場合は、エラーが発生します。 – user7021605

+0

子レコードセットの別のループを実行する必要があります。 [posted link](https://msdn.microsoft.com/en-us/library/office/ff191852.aspx)に示されているVBAと同じロジック編集された回答を参照してください。回答が助けられた場合は同意し、解決を確認してください。 – Parfait

+0

あなたは最高です!おかげでたくさん:) – user7021605

関連する問題