JAVA不直接支持动态解析文本文件中的表达式,只能通过手工拆分字符串再递归调用来实现,这需要编写大量代码,过程复杂难以维护。使用集算器来辅助Java编程,这些问题就不需要自己写代码了,下面我们通过例子来看一下具体作法。
文本文件formula.txt是tab分割的文本文件,第一行是列名,有3个列No、type、exp,其中exp列是公式。现在需要动态解析exp中的公式,并将计算结果附加在exp之后,命名为value列。文件fromula.txt的前几行数据如下:
集算器脚本如下:
A1:=file("E:\\ formula.txt").import@t(),函数import用来读入文本文件, 函数选项@t表示将第一行读为列名。读入后的数据存储在A1格中,如下:
A2:=A1.derive(eval(exp):value)。函数derive用来在A1中加入新的列,列名为value,列的值是eval(exp)。函数eval用来对字符串进行动态解析,比如eval(“1+1”)的计算结果是数字2。由于代码中的exp列是多个字符串组成的,因此eval(exp)的计算结果也是多个,如下:
动态公式已经解析完成,下面将A2输出到文本文件,即:
A3:=file("E:\\ result.txt").export@t(A2)
上述脚本中,函数export用来将A2中的数据写入文件result.txt,函数选项@t表示将列名写在第一行。打开这个文件,可以看到如下内容:
A4:result A2。这句脚本将A2中的数据返回JAVA。JAVA代码只需通过JDBC调用集算器脚本就能获得结果,代码如下。
//建立esProc jdbc连接
Class.forName("com.esproc.jdbc.InternalDriver");
con= DriverManager.getConnection("jdbc:esproc:local://");
//调用esProc,其中test是脚本文件名
st =(com.esproc.jdbc.InternalCStatement)con.prepareCall("call test()");
st.execute();//执行esProc存储过程
ResultSet set = st.getResultSet(); //获取结果集