【问题标题】:How to dynamically use data structure from CVS-File in Rhino – Class如何在 Rhino 中动态使用 CSV 文件中的数据结构 – 类
【发布时间】:2012-11-25 21:48:46
【问题描述】:

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

我想编写一个 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”应该是什么样子吗?我也很感激从哪里开始寻找一条建议。 谢谢您的帮助, 斯蒂芬妮

【问题讨论】:

    标签: java javascript rhino beanshell


    【解决方案1】:

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

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

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

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

    只是好奇,你在做什么?

    【讨论】:

    • 您好 Jackopo,感谢您的回复。在我的大学,我们有几个用于评估目的的脚本。我的目标是将所有这些不同的脚本放在一个 Java 应用程序中。所有这些方法的唯一共同点是测量数据存储在 CVS 或 XML 文件中。所以阅读文件是一个问题,但多亏了你的建议,我现在有了一个想法。另一个问题是如何访问数据。由于文件的结构不同,我有点需要“动态变量构建器”......或者我在这里遗漏了什么?谢谢,
    • 这取决于有多少不同,以及如何确定是哪种结构。您的意思是 CSV 文件有不同的列?也就是有时有其他数据,有时列的顺序不同?
    • 是的,大多数文件都有不同的列。在 java 编译期间,我不知道这些列将是什么。因此,我在考虑 Rhino 给用户一个“及时”的编码方法。
    • 对我来说似乎是个好主意,您可以为用户提供对帮助类的引用,从而使脚本更易于编写。在这种情况下,您可以使用一个值数组来表示当前行,因此列含义由脚本管理,脚本将操作该数组而不是显式提供的值和状态。
    • 你好。抱歉我回复晚了,但恐怕我不明白你的意思。你的意思是一个收集信息的助手类吗?感谢您的宝贵时间。
    【解决方案2】:

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

    我在 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
    

    希望你能做一些事情来完成你想做的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-23
      • 1970-01-01
      • 1970-01-01
      • 2011-11-19
      • 1970-01-01
      • 2015-09-14
      • 2019-11-15
      • 2022-12-04
      相关资源
      最近更新 更多