Я не очень-то знаком с 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
Любые идеи для этой ошибки?
[ПРИМЕЧАНИЕ]: некоторые ответы были предложены перед моими изменениями, поэтому теперь они могут казаться неуместными, но я использовал их в описанных выше шагах.
В этом вопросе я использую низкоуровневые функции rJava, которые нуждаются в явной спецификации типа в JNI. Рекомендуется, чтобы новички использовали функции более высокого уровня, такие как J() в пакете rJava. Я думаю, что rJava нуждается в хорошей виньетке! –