集算器協助Java處理結構化文本之條件過濾

直接用Java實現文本文件中數據按條件過濾會有如下的麻煩:

1、文件不是數據庫,不能用SQL訪問。當過濾條件變化時需要改寫代碼。如果要實現象SQL那樣靈活的條件過濾,則需要自己實現動態表達式解析和求值,編程工作量非常大。

2、文件太大時不能一次性裝入內存處理,而采用逐步讀入方式在考慮到性能時又會涉及到文件緩沖區管理、拆行計算等復雜編程。

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

文本文件employee.txt中保存了員工數據。我們要讀取員工信息,從中找出1981年1月1日(含)之后出生的女員工。

文本文件empolyee.txt的格式如下:

????EID NAME SURNAME GENDER STATE BIRTHDAY HIREDATE DEPT SALARY
????1 Rebecca Moore F California 1974-11-20 2005-03-11 R&D 7000
????2 Ashley Wilson F New York 1980-07-19 2008-03-16 Finance 11000
????3 Rachel Johnson F New Mexico 1970-12-17 2010-12-01 Sales 9000
????4 Emily Smith F Texas 1985-03-07 2006-08-15 HR 7000
????5 Ashley Smith F Texas 1975-05-13 2004-07-30 R&D 16000
????6 Matthew Johnson M California 1984-07-07 2005-07-07 Sales 11000
????7 Alexis Smith F Illinois 1972-08-16 2002-08-16 Sales 9000
????8 Megan Wilson F California 1979-04-19 1984-04-19 Marketing 11000
????9 Victoria Davis F Texas 1983-12-07 2009-12-07 HR 3000
????10 Ryan Johnson M Pennsylvania 1976-03-12 2006-03-12 R&D 13000
????11 Jacob Moore M Texas 1974-12-16 2004-12-16 Sales 12000
????12 Jessica Davis F New York 1980-09-11 2008-09-11 Sales 7000
????13 Daniel Davis M Florida 1982-05-14 2010-05-14 Finance 10000
????…

實現的思路是:用Java程序調用集算器腳本,讀取和計算數據,之后將結果以ResultSet的方式返回給Java程序。由于集算器支持動態表達式解析和求值,使得Java程序可以像使用sql那樣,靈活的過濾文本文件中的數據。

例如,我們需要查詢1981年1月1日(含)之后出生的女員工,esProc程序可以從外部獲得一個輸入參數“where”作為條件,如下圖:

?

where是個字串,取值是:BIRTHDAY>=date(1981,1,1) && GENDER==”F”。

esProc代碼如下:

A1:定義一個file對象,讀入數據,第一行是標題,字段分隔符默認是tab。esProc的集成開發環境可以直觀的顯示出導入的數據,如上圖右邊部分。

A2:按照條件過濾。這里使用宏來實現動態解析表達式,其中的where就是傳入參數。集算器先計算${…}里的表達式,將計算結果作為宏字符串值替換${…}之后解釋執行。這個例子中最終執行的是:=A1.select(BIRTHDAY>=date(1981,1,1) && GENDER==”F”)。

A3:向外部程序返回符合條件的結果集。

過濾條件發生變化時不用改變代碼,只需改變where參數即可。例如,條件變為:查詢1981年1月1日(含)之后出生的女員工,或者NAME+SURNAME等于”RebeccaMoore”的員工。Where的參數值可以寫為:BIRTHDAY>=date(1981,1,1) && GENDER==”F” || NAME+SURNAME==”RebeccaMoore”。執行之后,A2中的結果集如下圖:

在Java程序中使用esProc JDBC調用這段程序獲得結果的代碼如下:(將上述esProc程序保存為test.dfx):

????//建立esProc jdbc連接
????Class.forName(“com.esproc.jdbc.InternalDriver”);
????con= DriverManager.getConnection(“jdbc:esproc:local://”);
????//調用esProc 程序(存儲過程),其中test是dfx的文件名
????st =(com.esproc.jdbc.InternalCStatement)con.prepareCall(“call test(?)”);
????//設置參數
????st.setObject(1,” BIRTHDAY>=date(1981,1,1) && GENDER==\”F\” ||NAME+SURNAME==\”RebeccaMoore\”");//參數就是動態的過濾條件
????//執行esProc存儲過程
????st.execute();
????//獲取結果集:符合條件的員工集合
????ResultSet set = st.getResultSet();

對于代碼較簡單的腳本,還可以把代碼直接寫在調用集算器JDBC的Java程序中,而不必專門編寫腳本文件(test.dfx):
????st=(com. esproc.jdbc.InternalCStatement)con.createStatement();
????ResultSet set= st.executeQuery(“=file(\”D:/employee.txt\”).import@t().select(BIRTHDAY>=date(1981,1,1)&&GENDER==\”F\” || NAME+SURNAME==\”RebeccaMoore\”)”);

這段Java代碼直接調用了集算器的一句腳本:從文本文件中取得數據,并按照指定的條件過濾。結果集返回給ResultSet對象set。

上面方法中假定文件較小,可以全部讀入內存。但實際上可能發生文件較大無法讀入內容的情況,而且即使可以讀入也沒必要占太多內存,這時可以使用文件游標的方式來處理。集算器程序調整如下:

A1:定義一個file對象游標,第一行是標題,字段分隔符默認是tab。

A2:按照條件過濾游標。這里使用宏來實現動態解析表達式,其中的where就是傳入參數。集算器將先計算${…}里的表達式,將計算結果作為宏字符串值替換${…}之后解釋執行。這個例子中最終執行的是:=A1.select(BIRTHDAY>=date(1981,1,1) && GENDER==”F”)。

A3:返回游標。

雖然集算器給Java返回的是游標,但是Java調用的程序不用修改。在Java使用ResultSet遍歷數據的時候集算器會自動取出游標對應的內容。

如果需要將過濾后的數據寫入另一個文件而不是返回給主程序,只要將A3格的表達式改成:=file(“D:/employee_group.txt”).export@t(A2)即可,集算器將把游標數據寫出成文件。

轉載于:https://www.cnblogs.com/raqsoft/p/5056057.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397066.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397066.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397066.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python3動態加載模塊的方法實現

2019獨角獸企業重金招聘Python工程師標準>>> 需求 我們有時寫了一個功能,需要不斷地調整,但是已經在線上了,而且在執行任務, 這時要更新上去源文件,而不能結束掉當前進程,怎么辦? 所以這時&…

python 浮點數最小值_PYTHON學習筆記(3)——基本數據類型

本次學習原內容均來自MOOC國家精品課程《Python程序語言設計》嵩天第一篇在問題——“今天python了嗎?”中基本數據類型1、 整數(1)整數無限制 pow(x,y) 計算 (2)四種進制 2、 浮點數類型(1)取整…

2018.08.29 NOIP模擬 pmatrix(線性篩)

【問題描述】 根據哥德巴赫猜想(每個不小于 6 的偶數都可以表示為兩個奇素數之和),定義 哥德巴赫矩陣 A 如下:對于正整數對(i,j),若 ij 為偶數且 i,j 均為奇素數,則 Ai,j 1, 否則 Ai,j 0。現…

Windows Azure移動終端云服務管理(公測版)

概覽 云在遠方,管理在您手中。在這個移動為先 云為先的世界,服務不再是基于請求才提供,而是主動來到身邊方便您的模式了。我們最近將會陸續推出幾大移動端利器幫助您隨時隨地管理您的云服務。 首批利器之中排名第一當屬Azure云助手應用, 它是…

學習opencv3中文版_給視覺組新生的一點學習建議

如果說機械組是把機器人做出來電控組讓機器人動起來那么視覺組就是讓機器人智能化完成一個合格的機器人三者缺一不可今天就讓我們來看看視覺組師兄推薦的學習建議吧!1語言基礎 野狼隊視覺組目前使用的主要語言是C,同時也需要具備一定的C語言基礎。建議…

如何動態改變audio的播放的src

如何動態改變audio的播放的src 一、總結 一句話總結:js方式在請求外部網站的時候行,php方式在請求內外部資源都行。因為php走在js前面,所以問題可以從php方面想辦法。 1、如何使用js控制修改audio的src或它的source 的src屬性實現動態改變aud…

錯誤 open too many files

錯誤:服務器最大打開文件數65535啟動java程序報錯 open too many files解決辦法:1.增加文件描述符 #服務器本來就是65535了2.排查程序 #研發總監4.研發總監和我 一起看服務器lsof -p pid(程序)|wc -l5.最終確定程序的問題6.研發總監 去改…

mysql 水平拆分實例_2021先定個小目標?搞清楚MyCat分片的兩種拆分方法和分片規則!(二):水平拆分實例解析和代碼實現!...

一、概述根據表中的數據的邏輯關系,將同一個表中的數據按照某種條件拆分到多臺數據庫(主機)上面,這種切分稱之為數據的水平(橫向)切分。二、案例場景在業務系統中, 有一張表(日志表), 業務系統每天都會產生大量的日志數據 , 單臺服務器的數據存儲及處理能…

30分鐘快速搭建移動應用直傳OSS服務

30分鐘快速搭建移動應用直傳服務 背景 這是一個移動互聯的時代。手機APP上傳的數據會越來越多。把數據存儲的問題交給OSS, 讓開發者能更加專注于自己的應用邏輯。 那么怎么樣基于OSS構建一個APP存儲系統呢? 目的 本教程就是讓你在30分鐘內搭建一個基于OS…

用java判斷一個年份是否為閏年_判斷閏年還是平年

↑↑↑點擊上方圖片&#xff0c;了解詳情正文&#xff1a;判斷一個年份是閏年還是平年。閏年條件&#xff1a;1.可以被400整除。2.可以被4整除&#xff0c;但是不可以被100整除。代碼&#xff1a;Private Sub 查詢_Click() If Me.年份 Mod 4 0 And Me.年份 Mod 100 <> 0…

PAT L1-048 矩陣A乘以B

https://pintia.cn/problem-sets/994805046380707840/problems/994805082313310208 給定兩個矩陣A和B&#xff0c;要求你計算它們的乘積矩陣AB。需要注意的是&#xff0c;只有規模匹配的矩陣才可以相乘。即若A有R?a??行、C?a??列&#xff0c;B有R?b??行、C?b??列&a…

【JavaScript吉光片羽】--- 滑動條

燈光的亮度控制需要一個滑動條&#xff0c;先借用lamp源碼中Bar&#xff1a; var Bar function (opt) {var defaults {$id: "", // 進度條dom節點idmin: 1, // 刻度最小值stepCount: 5, // 刻度步數step: 1, // 刻度步長$alpha: "",//顯示亮度的idtouchE…

ldd /usr/bin/mysql_mysql客戶端登錄時報mysql: relocation error錯誤

在安裝了xtrabackup后&#xff0c;再用下列命令登錄時報下列錯誤[rootlocalhost ~]# mysql -u root -pmysql: relocation error: mysql: symbol strmov, version libmysqlclient_16 not defined in file libmysqlclient.so.16 with link time reference解決方法&#xff1a;查看…

python語言用什么關鍵字來聲明一個類_python使用什么關鍵字定義類

什么是類&#xff1f; 用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的實例。 什么是方法&#xff1f; 類中的函數即為方法 如何定義一個類&#xff1f; 定義類&#xff0c;語法格式如下&#xff1a;class ClassName:. . .…

谷歌+安卓,他已經改變了世界兩次,但還想多來幾次

回望拉里佩奇的創業經歷&#xff0c;小巴發現他在幾個創業者最有可能犯&#xff08;si&#xff09;錯&#xff08;bi&#xff09;的節點上都處理得很好。 你還記得你用的第一個搜索網站是什么嗎&#xff1f; Google.com 講到它的創始人&#xff0c;一般要連起來念&#xff0c; …

centos7 DNS服務器搭建

DNS&#xff0c;全稱Domain Name System&#xff0c;即域名解析系統。 DNS幫助用戶在互聯網上尋找路徑。在互聯網上的每一個計算機都擁有一個唯一的地址&#xff0c;稱作“IP地址”&#xff08;即互聯網協議地址&#xff09;。由于IP地址&#xff08;為一串數字&#xff09;不方…

lisp中怎樣調取圖形_CAD的lisp程序已加載,怎樣繪圖?

回答&#xff1a;1.計算所有線段總長度(加載后只需框選所有線段便可得出這些線段的總長度)(defun c:LL ()(setvar "cmdecho" 1)(setq en (ssget(list (0 . "spline,arc,line,ellipse,LWPOLYLINE"))))(setq i 0)(setq ll 0)(repeat (sslength en)(setq ss (…

Java Web的web.xml文件作用及基本配置(轉)

其實web.xml就是asp.net的web.config一個道理。 說明&#xff1a; 一個web中完全可以沒有web.xml文件&#xff0c;也就是說&#xff0c;web.xml文件并不是web工程必須的。 web.xml文件是用來配置&#xff1a;歡迎頁、servlet、filter等的。當你的web工程沒用到這些時&#xff0…

stand up meeting 12/21/2015

part組員 工作 工作耗時/h明日計劃工作耗時/h UI馮曉云 完成PDF UI主頁面的頁面切換功能&#xff0c;待完善 4 完善頁面切換&#xff0c;修補彈窗bug 4foxit PDF Reader朱玉影 修改了對pdf中文本進行搜索的代碼&#xff0c;使其更加robust 4 pdf…

python快速檢測視頻跳過幀_使用Python實現跳幀截取視頻幀

本文實例為大家分享了Python跳幀截取視頻幀的具體代碼&#xff0c;供大家參考&#xff0c;具體內容如下 可以自由設定時長來截取視頻&#xff0c;經實測效果理想。期間遇到的一個麻煩是我的視頻文件在D:盤&#xff0c;在原視頻D盤目錄上不能保存截取的圖片文件&#xff0c;后改…