2016-04-05 8 views
0

異なるアクセスファイル(同じフォルダの下にある別のサブフォルダにある)をマージしようとしています。さまざまなブログや人々がここで尋ねたいくつかの質問を読んだ後、私は以下のコードを思いついた。複数のACCESSファイルをRで結合する

Parent.Folder<-"D:/Documents/Rwd" 
setwd(Parent.Folder) 
library(RODBC) 
subfolders<-list.dirs(Parent.Folder, recursive = TRUE)[-1] 
list_filenames<-list.files(subfolders, recursive = FALSE) 
list_filenames<-paste("D:/Documents/Rwd/", list_filenames, sep="") 
list_filenames<-sub(".mdb","",list_filenames) 
for (file in list_filenames){ 
    if(!exists("data")){ 
    channel<-odbcConnectAccess(file) 
    data<-sqlQuery(channel,paste("select* from HRESULTS")) 
    close(channel) 
    } 

    if(exists("data")){ 
    channel<-odbcConnectAccess(file) 
    temp_data<-sqlQuery(channel,paste("select* from HRESULTS")) 
    data<-rbind(data,temp_data) 
    rm(temp_data) 
    close(channel) 
    } 
} 

すべてのテーブルは同じフォーマットであり、私の目的は1つのデータフレームでそれらを取得することです。最初のif文が正常に実行され、最初のファイルのデータを含むデータフレームが返されましたが、その後、エラー "sqlQueryのエラー(チャンネル、貼り付け(" select * from HRESULTS ")): 最初の引数が開いていませんRODBCのチャンネル " 私は非常に明白な間違いをしている場合、私は謝罪する前にODBCやSQLで働いたことがない。どんな助けでも大歓迎です。ありがとう!

+0

が鳴ります。アクセスファイルは、R-32ビットを介して接続するのが好きではありません。また、ファイルに応じて、 'odbcConnectAccess2007'がより良いサービスを提供するかもしれません。特に私の経験は.accdbファイルであり、異なる動作をするかどうかはわかりません。あなたが全体のテーブルをつかんでいるなら 'sqlFetch'を使うことができます。これは少し早く見つけました。 – Badger

+0

[This](http://svitsrv25.epfl.ch/R-doc/library/Hmisc/html/mdb.get.html)も役に立ちます。単にmdbテーブルを 'Hmisc'パッケージから取り出します。 – Badger

+0

@Badger - Hmiscには必要なように見えるのでmdb-toolsパッケージをインストールしようとしましたが、 'mdb-tools'はRバージョン3.2.3では使用できません。この問題を解決するために何をすべきかは不明です。 – asmi

答えて

2

SQLiteのようなファイルレベルのデータベースシステムであるため、MS AccessファイルにはODBC接続の拡張子を含むフルパス参照が必要です。

list.files引数full.names = TRUEを使用して、実行可能なアクセス拡張子.mdbまたは.accdbのみをフィルタリングすることを検討してください。最後に、あなたが後で最終データフレームに連結するdo.call(rbind...)を実行することができますインポートしたクエリデータテーブルの成長のリストについては、lapply使用することを検討してください:あなたのエラーは、既存のファイルがあるよう

Parent.Folder <- "D:/Documents/Rwd" 
subfolders <- list.dirs(Parent.Folder, recursive = TRUE)[-1] 

list_filenames <- list.files(subfolders, full.names = TRUE, recursive = FALSE) 
acc_files <- list_filenames[grep(".mdb|.accdb", list_filenames)] 

output <- lapply(acc_files, 
       function(file) { 
        channel <- odbcConnectAccess(file) 
        # ALTERNATIVE CONNECTION 
        # channel <- odbcDriverConnect(paste0('driver= 
        #   {Microsoft Access Driver (*.mdb, *.accdb)}; 
        #   DBQ=', file))       
        data <- sqlQuery(channel, "select * from HRESULTS") 
        close(channel) 
        return(data) 
       }) 

data <- do.call(rbind, output) 
+0

@ Parfait-ありがとうございます。スクリプトはエラーなしで実行されました。私は何が間違っているのか分かりません。私のスクリプトで問題を説明することは可能でしょうか。そうでなければ、私は理解する。ありがとうございました! – asmi

+0

私が理解しているのは、ブログごとに.mdb(ファイル拡張子)を用意していたからです。しかし、データベースに接続するには拡張子のフルネームが必要でした! – Badger

+0

@Badgerを修正してください。 OPが拡張を削除し、サブサブディレクトリが含まれていた場合、一部のファイルに対して誤ったパスが貼り付けられた可能性があります。だから 'full.names'を使うだけです。さらに、非mdbファイルはODBC接続に渡されます。 – Parfait