文本文件emp.txt存放员工信息,EId等于1的员工不包含在该文件中。文本文件sOrder.txt存储订单信息,其SellerId字段对应emp中的EId字段。SellerId等于2的订单不在此表中。部分源数据如下:emp.txt:sOrder.txt:现在需要将emp、Name、Dept、Gender这三个字段对齐到sOrder中,并将计算结果输出到一个新的文件中。预期计算结果如下:集算器代码:单元格A1和A2分别从文本文件中读取数据,存储在两个变量emp和sOrder中。这里使用了函数import,默认的列分隔符是tab,函数选项@t表示读取***行作为字段名。由于示例中只需要emp.txt中的部分字段,所以A1需要使用字段名作为参数。计算完成后emp和sOrder的值如下:A3:=join@1(sOrder:s,SellerId;emp:e,EId)。join函数执行连接操作,将s和e两张表重命名。其中,函数选项@1表示leftjoin,也就是例子中的要求:alignemptosOrder。计算后结果如下:点击蓝色链接查看具体记录,如下:Rightjoin只是交换对齐位置,用集算器也可以实现。比如让sOrder按照emp对齐,只需要将代码中两者的顺序互换即可,即=join@1(emp:e,EId;sOrder:s,SellerId),计算结果为如下:全连接也很容易实现,只需要使用函数选项@f,代码为:join@f(sOrder:s,SellerId;emp:e,EId),计算结果如下:有四个join操作的种类,除了上面提到的leftjoin、rightjoin、fulljoin之外,还有innerjoin。join函数默认执行innerjoin,代码为=join(sOrder:s,SellerId;emp:e,EId),计算结果如下:回到例子,A4:=A3.new(s.OrderID,s.Client,s.SellerId,s.Amount,s.OrderDate,e.Name,e.Dept,e.Gender)。这段代码从连接的表中获取需要的字段,形成一个新的结构化二维表。计算结果如下:对齐工作已经完成,数据将输出到下面的新文件中。代码是:=file("E:\\result.txt").export@t(A4)。函数export默认使用tab作为列分隔符,函数选项@t表示在***行输出字段名。打开result.txt,可以看到如下内容:上面的脚本已经完成了所有的输出工作,接下来只需要在JAVA代码中调用即可。//建立集算器jdbc连接Class.forName("com.esproc.jdbc.InternalDriver");con=DriverManager.getConnection("jdbc:esproc:local://");//调用集算器,其中test为脚本文件namest=(com.esproc.jdbc.InternalCStatement)con.prepareCall("calltest()");//执行集算器存储过程st.execute();只要执行上面的JAVA代码,emp就会对齐sOrder,并将计算结果输出到result.txt文件中。下面稍微改动一下例子:根据动态时间段查询sOrder中的数据,进行同样的对齐操作,最后直接将结果返回给JAVA。为了实现这个例子,集算器需要定义两个参数begin和end,分别代表开始时间和结束时间。集算器代码如下:红色部分为修改后的代码。A2:使用函数select进一步过滤sOrder。过滤条件是JAVA的起止时间,即@begin和@end。A5:将A4中的计算结果输出到JDBC接口。JAVA代码也需要做相应的修改,以便传入参数和获取计算结果。代码如下:Class.forName(“com.esproc.jdbc.InternalDriver”);con=DriverManager.getConnection(“jdbc:esproc:local://”);st=(com.esproc.jdbc.InternalCStatement)con.prepareCall(“调用测试(?,?)”);st.setObject(1,startTime);st.setObject(2,endTime);st.execute();ResultSetset=st.getResultSet();
