2015-08-17 4 views
1

Я не очень-то знаком с Java, но я постараюсь выполнить эту задачу в R (мой fav)!Использование Jackcess из R с помощью rJava

Эта библиотека Java называется Jackcess. Я хочу подключиться к этой библиотеке и открыть файл MS Access 2003 .mdb. 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") 

[Edit: я узнал, что у меня было две проблемы, одна решена, все еще нет.] до этой части все в порядке, но у меня есть некоторые проблемы, теперь :

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 правильно, мой второй раунд попытки: с Викисклада входа в пути к классам

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 

Любые идеи для этой ошибки?

[ПРИМЕЧАНИЕ]: некоторые ответы были предложены перед моими изменениями, поэтому теперь они могут казаться неуместными, но я использовал их в описанных выше шагах.

+0

В этом вопросе я использую низкоуровневые функции rJava, которые нуждаются в явной спецификации типа в JNI. Рекомендуется, чтобы новички использовали функции более высокого уровня, такие как J() в пакете rJava. Я думаю, что rJava нуждается в хорошей виньетке! –

ответ

0

Следующий код показывает альтернативный подход в Java с использованием методов в «реальной» DatabaseBuilder объекта .setFile и .open:

File file = new File("C:/Users/Public/jackcessTest.mdb"); 
DatabaseBuilder dbbo = new DatabaseBuilder(); 
dbbo.setFile(file); 
Database db = dbbo.open(); 

попробовать что-то подобное в rJava и посмотреть, если он работает для вас.

Edit Re: обновленный вопрос

Вы упомянули, что вы добавили Apache commons-logging к вашему CLASSPATH, но Jackcess также полагается на Apache commons-lang v2.x (не 3.х), поэтому попытайтесь загрузить это и в том числе и в вашем CLASSPATH.

+0

Проблема заключается в совпадении подписей. например, я попытался запустить вашу 3-ю строку в rJava: .jcall (dbbo, method = "setFile", "L ", файл), все, что я пишу, знак не совпадает. –

+0

.jmethods (dbbo, "setFile") [1] "public com.healthmarketscience.jackcess.DatabaseBuilder com.healthmarketscience.jackcess.DatabaseBuilder.setFile (java.io.File)", так что должен мой .jcall быть? –

+0

Я добавил некоторые commons logging v.2.0 назад когда-то, но у меня были другие ошибки, и я удалил его. Но да, ваше редактирование решает, что последняя проблема осталась в моем вопросе. –

 Смежные вопросы

  • Нет связанных вопросов^_^