java只提供了指定分割符等最基本的數據讀入功能,而其他常見功能都需要自己從底層去實現,比如:按列名讀入指定列、指定列的次序、指定數據類型、無分割符等等。JAVA實現這類功能雖然不難,但代碼很繁瑣,很容易出錯。
使用集算器來輔助Java編程,這些問題都不需要自己寫代碼解決。下面我們通過例子來看一下具體作法。
文本文件data.txt是tab分割的文本文件,有30個列,第一行是具有業務意義的列名,現在需要按列名讀入這幾列:ID、x1Shift、x2Shift、radio,并按業務公式“((x1Shift+x2Shift)/2)*radio”計算出新列value。文件的前幾行前幾列如下 :
用JAVA解決時,我們必須將30個列都拆分出來,然后用下標引用特定的列進行計算,如果公式較多,計算較復雜,則出錯的概率很大。為了減少誤寫的情況,我們只能用對象來存儲每一條數據,并給每個字段賦予業務名稱,再按業務名稱進行公式計算。
集算器可以幫助JAVA避免這些麻煩,代碼如下:

A1:函數import用來讀入文件,但并非將30個列都讀入內存,而是按列名讀入指定列。參數選項@t表示將第一行讀為列名。這一步的計算結果如下:

A2:直接按照業務名進行計算,計算結果如下:

實際使用中,上述計算結果有時要輸出到文件中,使用這句代碼可以實現這個目的:=file(“E://result.txt”).export@t(A2.new(ID,value)),這表示將ID和value這兩列寫入文件result.txt,文件內容如下:

如果需要將計算結果傳回JAVA繼續使用,只需在集算器中書寫代碼:result A2.new(ID,value)),這表示將ID和result這兩列通過JDBC接口返回JAVA,數據類型是resultSet。之后只需在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(); //獲取結果集
讀入數據時,有時候需要指定列的次序,以便更直觀地操作數據。比如對于同樣的文件data.txt,這次要按照x1Shift、x2Shift、radio、ID的新順序讀入數據。集算器可以直接指定順序,只需書寫如下代碼:=file(“E://data.txt”).import@t(xShift,yShift,ratio,ID)。
計算結果如下:

上述代碼中,集算器會自動為數據設置合適的類型,比如xShift和yShift會設置為float型。但有時我們需要指定數據類型,比如ID雖然類似整數,但實際是字符串。如果要將ID的前4個字符單獨取出,則集算器可通過如下代碼來實現:

A1:強制類型轉換,將ID列讀為字符串,結果如下:

注意:集算器約定字符串在IDE中左對齊顯示,數字右對齊顯示,如上所示。
A2:截取前四個字符,結果如下:

讀入數據時,有時候會遇到無分割符的情況,比如data2.txt有20個列,部分數據如下:

可以看到,data2.txt沒有列分割符,且部分數據是無用的空行。集算器可以通過如下代碼讀取正確的數據:

A1:將數據讀為單列序表,列名默認為“_1”。其中函數選項@s表示不拆分字段,直接讀取。結果如下:

A2:A1.select(trim(_1)!=”"),過濾出非空行。函數select可以按照字段名或序號進行查詢,結果如下:

A3:=A2.new(mid(_1,1,1),mid(_1,2,1),mid(_1,3,1),mid(_1,4,1),mid(_1,5,1),mid(_1,6,1), mid(_1,7,1),mid(_1,8,1),mid(_1,9,1),mid(_1,10,1),mid(_1,11,1),mid(_1,12,1),mid(_1,13,1),mid(_1,14,1),
mid(_1,15,1),mid(_1,16,1),mid(_1,17,1),mid(_1,18,1),mid(_1,19,1),mid(_1,20,1))
這句長代碼用來將每行數據拆分為20個字段。函數mid有三個參數,分別是:被拆分的字段名,起始位置,截取的長度。拆分后的結果如下:

A3就是我們需要的計算結果。
A3中的代碼太長,不利于錯誤檢查和維護,可以使用集算器的動態代碼予以簡化,如下:
A4:=20.loops(~~+”mid(_1,” + string(~) + “,1),”)
A5:=exp=left(A4,len(A4)-1)
A6:=eval(“A2.new(“+ A5+”)”)
A4中,函數loops可用來進行循環計算,生成有規律的字符串,即“mid(_1,1,1),mid(_1,2,1),mid(_1,3,1),mid(_1,4,1),mid(_1,5,1),mid(_1,6,1),mid(_1,7,1),mid(_1,8,1),
mid(_1,9,1),mid(_1,10,1),mid(_1,11,1),mid(_1,12,1),mid(_1,13,1),mid(_1,14,1),mid(_1,15,1),
mid(_1,16,1),mid(_1,17,1),mid(_1,18,1),mid(_1,19,1),mid(_1,20,1),”
字符串A4在末尾多了一個逗號,用A5中的代碼可以去掉逗號。
A6:執行動態腳本。函數eval可以將字符串動態解析為表達式,比如eval(“2+3”)相當于表達式2+3,其值為5。因此A5中的表達式實際和A3完全一樣,計算結果自然也完全一樣:

新聞熱點
疑難解答