我想完成以下任务。我不确定是否有可能按照我计划的方式这样做,但因此我的问题是:
我想编写一个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”应该是什么样的?我也很感激建议从哪里开始寻找。 谢谢您的帮助, 斯蒂芬妮
答案 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
希望你可以做些什么来完成你想要做的事情。