如何动态使用Rhino中的CSV文件数据结构 - Class

时间:2012-11-25 21:48:46

标签: java javascript rhino beanshell

我想完成以下任务。我不确定是否有可能按照我计划的方式这样做,但因此我的问题是:

我想编写一个Java程序,允许用户加载XML或CSV文件,并在Rhino或Beanshell等某种脚本环境中操作和使用他们的内容。 脚本应该如下所示:

var myData = new dataLoader(“some_file.csv”);
myData.load(); // should load the content
(while myData.next()) {
  If( myData.status == “pending”) {
    myData.value = myData.value + 1;
    myData.status = “updated”; //set new status
    myData.update(); //update dataset
  }
}

Some_file.csv:

“值”; “状态”;

“1”; “待处理”;

“21”; “待处理”;

“341”; “待处理”;

这是否可行(根据文件'内容动态提供方法/函数/变量)?如果是这样,任何想法我的课“dataLoader”应该是什么样的?我也很感激建议从哪里开始寻找。 谢谢您的帮助, 斯蒂芬妮

2 个答案:

答案 0 :(得分:0)

你可能想要创建一个类来读取文件的所有行,使用BufferedReader方法readLine或通过Guava,has a function执行此操作。 对于XML,您需要一个DOM解析器,它将加载树中的所有文件。

然后,将数据存储在LinkedList或数组中,并使用整数变量作为索引。 当调用方法next()时,如果它等于数组的大小,它将增加索引并返回false,否则返回true。它还会为新值设置值和状态。

Update()当然会使用字段值更新索引位置的值。

问题是何时将结构写入磁盘。您可以在最后一次调用next()时执行此操作,如果您确定它将被迭代调用直到结束,或者创建像flush()这样的方法将数组写入文件。 另一种方法是使用update()方法编写,这似乎是最适合您的方法。

只是出于好奇,你在做什么?

答案 1 :(得分:0)

这将是一个非常有趣的项目,我很确定它可以完成。

我在BeanShell中使用轻量级脚本对象来保存数据,如下所示:

    myData(value, status) {
     return this;
    };

   listofitems = new java.util.List();
   for(entry : data) {
     listofitems.add(myData(entry.value, entry.status);
   }

考虑到这一点并假设您解析了csv文件的行并获得了标题,您可以动态构建脚本化的对象:

hdr1 = "value";
hdr2 = "status";
scriptedObjectStr = "myData(" + hdr1 + "," + hdr2 + ") { return this; }";

eval(scriptedObjectStr);


y = myData("Test", "Pending");
print(y.value); // Test
print(y.status); // Pending

希望你可以做些什么来完成你想要做的事情。