国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

集算器協助java處理結構化文本之數據讀入

2019-11-14 14:50:31
字體:
來源:轉載
供稿:網友

java只提供了指定分割符等最基本的數據讀入功能,而其他常見功能都需要自己從底層去實現,比如:按列名讀入指定列、指定列的次序、指定數據類型、無分割符等等。JAVA實現這類功能雖然不難,但代碼很繁瑣,很容易出錯。

使用集算器來輔助Java編程,這些問題都不需要自己寫代碼解決。下面我們通過例子來看一下具體作法。

文本文件data.txt是tab分割的文本文件,有30個列,第一行是具有業務意義的列名,現在需要按列名讀入這幾列:ID、x1Shift、x2Shift、radio,并按業務公式“((x1Shift+x2Shift)/2)*radio”計算出新列value。文件的前幾行前幾列如下 :

用JAVA解決時,我們必須將30個列都拆分出來,然后用下標引用特定的列進行計算,如果公式較多,計算較復雜,則出錯的概率很大。為了減少誤寫的情況,我們只能用對象來存儲每一條數據,并給每個字段賦予業務名稱,再按業務名稱進行公式計算。

集算器可以幫助JAVA避免這些麻煩,代碼如下:

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

esProc_java_structured_dataimport_3

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

esProc_java_structured_dataimport_4

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

esProc_java_structured_dataimport_5

如果需要將計算結果傳回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)。

計算結果如下:

esProc_java_structured_dataimport_6

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

esProc_java_structured_dataimport_7

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

esProc_java_structured_dataimport_8

注意:集算器約定字符串在IDE中左對齊顯示,數字右對齊顯示,如上所示。

A2:截取前四個字符,結果如下:

esProc_java_structured_dataimport_9

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

esProc_java_structured_dataimport_10

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

esProc_java_structured_dataimport_11

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

esProc_java_structured_dataimport_12

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

esProc_java_structured_dataimport_13

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有三個參數,分別是:被拆分的字段名,起始位置,截取的長度。拆分后的結果如下:

esProc_java_structured_dataimport_14

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完全一樣,計算結果自然也完全一樣:

esProc_java_structured_dataimport_15


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 武安市| 外汇| 东台市| 石城县| 泸溪县| 松阳县| 黄龙县| 咸宁市| 比如县| 二连浩特市| 油尖旺区| 安多县| 泰宁县| 丰城市| 罗山县| 牡丹江市| 江北区| 乌鲁木齐县| 汤阴县| 韩城市| 平和县| 宜良县| 皮山县| 龙江县| 云梦县| 敦煌市| 彭泽县| 双牌县| 陇川县| 桐城市| 临沂市| 宁乡县| 沂水县| 磴口县| 新源县| 堆龙德庆县| 含山县| 广饶县| 阳新县| 会理县| 澄江县|