首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用rJava从R中使用Jackcess

使用rJava从R中使用Jackcess
EN

Stack Overflow用户
提问于 2015-08-17 14:42:47
回答 2查看 434关注 0票数 1

我对Java不太熟悉,但我尝试用R (我的fav)完成这个任务!

有一个名为JavaJackcess库。我想连接到这个库,并在其中打开一个MS 2003 .mdb文件。杰克塞斯食谱告诉我使用这个库的第一步是:

代码语言:javascript
复制
Database db = DatabaseBuilder.open(new File("mydb.mdb"));

或者正如戈德所暗示的,

代码语言:javascript
复制
File file = new File("C:/Users/Public/jackcessTest.mdb");
DatabaseBuilder dbbo = new DatabaseBuilder();
dbbo.setFile(file);
Database db = dbbo.open();

但我被困在了第一步。

我已经安装了Java和rJava,并设置了所有关于目录的内容。这是我在R中的代码

代码语言:javascript
复制
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")

编辑:我发现我有两个问题,一个解决了,一个还没有解决。到现在为止一切都还好,但从现在开始我有一些问题:

1]正确地从Jackcess调用一个没有签名不匹配的方法,这两个都不工作:

代码语言:javascript
复制
dbbo <- .jcall(dbbo,"L<DatabaseBuilder>","setFile",file)
dbbo <- .jcall(dbbo,"Lcom/healthmarketscience/jackcess/DatabaseBuilder","setFile",file)

我知道这个错误:

代码语言:javascript
复制
Error in .jcall(dbbo, "Lcom/healthmarketscience/jackcess/DatabaseBuilder",  : 
method setFile with signature (Ljava/io/File;)Lcom/healthmarketscience/jackcess/DatabaseBuilder not found

我找到了这个步骤的答案,我只需要在类定义字符串的末尾使用分号(;)。

代码语言:javascript
复制
dbbo <- .jcall(dbbo,"Lcom/healthmarketscience/jackcess/DatabaseBuilder;","setFile",file)

2]正确调用open方法,这是我的第一轮尝试:

代码语言:javascript
复制
 db <- .jcall(dbbo,"Lcom/healthmarketscience/jackcess/Database;","open",evalArray = FALSE,evalString = FALSE)

我得到了一个错误:

代码语言:javascript
复制
 Error in .jcall(dbbo, "Lcom/healthmarketscience/jackcess/Database;", "open",  : 
 java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

我在googled上搜索并发现Jackcess依赖于一个名为共用测井的库,所以下载它并将其添加到类路径解决了这个问题。

3]正确调用open方法,这是我的第二轮尝试:在类路径中使用共用日志记录。

代码语言:javascript
复制
db <- .jcall(dbbo,"Lcom/healthmarketscience/jackcess/Database;","open",evalArray = FALSE,evalString = FALSE)

这给了我一个错误:

代码语言:javascript
复制
Error in .jcall(dbbo, "Lcom/healthmarketscience/jackcess/Database;", "open",  : 
java.lang.NoClassDefFoundError: Could not initialize class com.healthmarketscience.jackcess.impl.DatabaseImpl

对这个错误有什么想法吗?

注意:一些答案是在我编辑之前提出的,所以现在看来它们似乎无关紧要了,但我已经在我前面解释的步骤中使用了它们。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-18 16:35:19

下面的代码展示了Java中使用“真实”.setFile对象的.openDatabaseBuilder方法的另一种方法:

代码语言:javascript
复制
File file = new File("C:/Users/Public/jackcessTest.mdb");
DatabaseBuilder dbbo = new DatabaseBuilder();
dbbo.setFile(file);
Database db = dbbo.open();

在rJava中尝试类似的东西,看看它是否适合您。

编辑re:更新的问题

您提到您向CLASSPATH添加了Apache,但Jackcess也依赖于Apache v2.x (而不是v3.x),因此请尝试下载该共用测井并将其包括在CLASSPATH中。

票数 0
EN

Stack Overflow用户

发布于 2018-06-05 05:52:58

3项建议:

将commons-lang-2.0.jar包含在classPath中,类似于

代码语言:javascript
复制
rJava::.jaddClassPath("commons-lang-2.0.jar")

简单的方法是尝试使用J()调用,如下所示:

代码语言:javascript
复制
dbb <- rJava::.jnew("com/healthmarketscience/jackcess/DatabaseBuilder")
dbjfile <- rJava::.jnew('java/io/File', "D:/63.mdb")
dbop <- rJava::J(dbb, "open", dbjfile)

不管它的价值是什么,如果你真的想用低级的方式去做,这是一种尝试的方法:

代码语言:javascript
复制
dbop <- .jcall(
    "RJavaTools"
  , "Ljava/lang/Object;"
  , "invokeMethod"
  , .jcall(dbb, "Ljava/lang/Class;", "getClass")
  , .jcast(dbb, "java/lang/Object")
  , .jnew("java/lang/String", "open")
  , .jarray(list(dbjfile), "java/lang/Object", dispatch = FALSE)
  , .jarray(rJava:::._java_class_list(list(dbjfile)), "java/lang/Class", dispatch = FALSE)
  , use.true.class = TRUE
  , evalString = TRUE
  , evalArray = FALSE
  )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32053273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档