用集算器处理结构化文本文件的排序问题ITeye - 娱乐之横扫全球

用集算器处理结构化文本文件的排序问题ITeye

2019年03月13日09时48分24秒 | 作者: 鹏煊 | 标签: 排序,算器,文件 | 浏览: 2810

直接用Java完成文本文件排序,关于小文件还较为简略,假如是内存装不下的大文件,需求分段读入数据,再将每段排序成果写成临时文件,终究归并这些临时文件,编程非常复杂。即便只处理内存可放下的小文件,也要面临解析文本中数据类型的使命,尽管不是很难,但要写较长的代码。

运用集算器辅佐java编程就能够轻松躲避这些问题。下面咱们来看一下详细作法。文本文件employee.txt中保存的职工信息,需求依照STATE的升序和BIRTHDAY的降序排序。假定文件中的数据量较大,内存不能一次装入。

         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程序。要依照STATE的升序和BIRTHDAY的降序排序,esProc程序能够从外部获得一个输入参数“sortBy”作为排序表达式,如下图:



 

  “sortBy”的值是:STATE,-BIRTHDAY。字段前面加上减号代表相反数,关于字符串、数值和日期类型数据都是有用的。

esProc代码如下:



 

        A1:界说一个file游标目标,榜首行是标题,字段分隔符默许是tab。

        A2:依照表达式来排序。这儿运用宏来完成动态解析表达式,其间的sortBy就是传入参数。集算器先核算${…}里的表达式,将核算成果作为宏字符串值替换${…}之后解说履行。这个比如中终究履行的是:=A1.sortx(STATE,-BIRTHDAY;1000000)。

        A3:向外部程序回来成果游标。Java运用ResultSet承受回来成果遍历数据的时分,集算器会主动读取游标对应的内容。假如要将排序数据写入其他文件,则把A3改为=file("D:/employee_result.txt").export@t(A2)。

        排序字段和方向发生变化时不必改动程序,只需改动sortBy参数即可。例如,依照NAME的升序、STATE的降序、BIRTHDAY的降序排序,sortBy值写为:NAME,-STATE,-BIRTHDAY。

sortx函数依照缓冲区行数每次读取部分数据来排序,成果写入临时文件,并从头使用内存。之后,再将生成的临时文件归并。这儿的参数1000000就是指缓冲行数,取值原则是充分使用内存以削减临时文件数量。这个数值和物理内存及记载的巨细都有关,编程时要预算一下,一般主张在几十万到上百万的量级。

在Java程序中经过集算器的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," NAME,-STATE,-BIRTHDAY");

//履行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\").cursor@t().sortx(NAME,-STATE,BIRTHDAY;1000000)");

这段Java代码直接调用了集算器的一句脚本:从文本文件中获得数据核算后,成果集回来给ResultSet目标set。

 

 

假如employee.txt文件较小,能够一次装入内存,能够改用sort函数来做全内存排序,集算器不再写临时文件,核算速度要快许多。代码如下:



 

sortBy参数能够写成STATE,-BIRTHDAY,也能够写成:STATE:1,BIRTHDAY:-1。Java调用的程序不必修正。

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表娱乐之横扫全球立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章