私はあまり慣れていませんが、 (私のお気に入り)Java
でこのタスクを達成しようとしています!R
Java
というライブラリ がありJackcess
ます。.mdb
このライブラリに接続して、その中の MS Access 2003ファイルを開きたいです。Jackcess cookbookによると、このライブラリを使用するための最初のステップは次のとおりです。
Database db = DatabaseBuilder.open(new File("mydb.mdb"));
または@Gordが示唆するように、
File file = new File("C:/Users/Public/jackcessTest.mdb");
DatabaseBuilder dbbo = new DatabaseBuilder();
dbbo.setFile(file);
Database db = dbbo.open();
しかし、私はこの最初のステップで立ち往生しています。
Java と rJava をインストールし、ディレクトリに関するすべての設定を行いました。これは私のコードですR
library(rJava)
.jinit()
.jaddClassPath("java/jackcess-2.1.2.jar") # there I have put the downloaded jar file of Jackcess
# .jaddClassPath("java/commons-logging-1.2.jar") # this is the commons-logging class that Jackcess depends on, commented to replicate problem 2] in my question.
file.name <- "D:/63.mdb" # some data base .mdb file (containing only tables)
file <- .jnew("java/io/File",file.name)
dbbo <- .jnew("com/healthmarketscience/jackcess/DatabaseBuilder")
[編集: 2 つの問題があり、1 つは解決済みで、もう 1 つはまだ解決していないことがわかりました。] この部分まではすべて問題ありませんが、これからいくつかの問題が発生します。
1]署名の不一致なしでJackcessからメソッドを正しく呼び出すと、これらのどちらも機能しません。
dbbo <- .jcall(dbbo,"L<DatabaseBuilder>","setFile",file)
dbbo <- .jcall(dbbo,"Lcom/healthmarketscience/jackcess/DatabaseBuilder","setFile",file)
次のエラーが表示されます。
Error in .jcall(dbbo, "Lcom/healthmarketscience/jackcess/DatabaseBuilder", :
method setFile with signature (Ljava/io/File;)Lcom/healthmarketscience/jackcess/DatabaseBuilder not found
このステップの答えが見つかりました;
。クラス定義文字列の最後にセミコロン ( ) が必要でした。
dbbo <- .jcall(dbbo,"Lcom/healthmarketscience/jackcess/DatabaseBuilder;","setFile",file)
2]メソッドを正しく呼び出すopen
、私の最初の試行ラウンド:
db <- .jcall(dbbo,"Lcom/healthmarketscience/jackcess/Database;","open",evalArray = FALSE,evalString = FALSE)
そして、私はこのエラーを受け取ります:
Error in .jcall(dbbo, "Lcom/healthmarketscience/jackcess/Database;", "open", :
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
私はググって、Jackcessがcommons-loggingと呼ばれるいくつかのライブラリに依存していることを発見したので、それをダウンロードしてクラスパスに追加すると、その問題が解決します
3]メソッドを正しく呼び出すopen
、私の2回目の試行:クラスパスにcommons-loggingを使用
db <- .jcall(dbbo,"Lcom/healthmarketscience/jackcess/Database;","open",evalArray = FALSE,evalString = FALSE)
これは私にこのエラーを与えます:
Error in .jcall(dbbo, "Lcom/healthmarketscience/jackcess/Database;", "open", :
java.lang.NoClassDefFoundError: Could not initialize class com.healthmarketscience.jackcess.impl.DatabaseImpl
このエラーのアイデアはありますか?
[注]: 編集前にいくつかの回答が提案されたため、現在は無関係に見えるかもしれませんが、上記で説明した手順でそれらを使用しました。