集算器協助java處理結構化文本之對齊串連,java結構化
資料庫有關聯語句,可以方便地進行對齊串連運算,但有時資料是儲存在文字檔中的,用JAVA直接計算需要寫大量迴圈語句才能實現,代碼繁瑣且運行低效。使用集算器來輔助Java編程,可以方便高效地解決此類問題。下面我們通過例子來看一下具體作法。
文字檔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表示左串連,即例子中的要求:將emp對齊到sOrder中。計算後結果如下:
點擊藍色連結可以看到具體的記錄,如下:
右串連只是交換對齊的位置,同樣可以用集算器來實現。比如將sOrder按照emp對齊,只需要在代碼中交換兩者的順序,即=join@1(emp:e,EId;sOrder:s,SellerId),計算結果如下:
全串連也很容易實現,只需要使用函數選項@f,代碼是:join@f(sOrder:s,SellerId;emp:e,EId),計算結果如下:
串連運算共有四種,除了上面提到的左串連、右串連、全串連,還有內串連。函數join預設執行內串連,代碼是=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代碼中調用即可。
//建立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()”);
//執行esProc預存程序
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(“call test(?,?)”);
st.setObject(1,startTime);
st.setObject(2,endTime);
st.execute();
ResultSet set = st.getResultSet();