`
datamachine
  • 浏览: 157238 次
社区版块
存档分类
最新评论

用集算器解决结构化文本文件的排序问题

阅读更多

直接用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 程序(存储过程),其中testdfx的文件名

st =(com.esproc.jdbc.InternalCStatement)con.prepareCall("call test(?)");

//设置参数

st.setObject(1," NAME,-STATE,-BIRTHDAY");

//执行esProc存储过程

st.execute();

//获取结果集:符合条件的员工集合

ResultSet set = st.getResultSet();

对于较简单的脚本,还可以直接把代码写在调用集算器JDBCJava程序中,而不必专门编写集算器脚本文件(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:-1Java调用的程序不用修改。

  • 大小: 21.6 KB
  • 大小: 12.7 KB
  • 大小: 11.4 KB
0
0
分享到:
评论

相关推荐

    史上最全经典数据结构算法c语言实现代码合集

    读写文本文件.txt 货郎担分枝限界图形演示.txt 货郎担限界算法.txt 质因子.txt 输出自已.txt 迷宫.txt 迷宫问题.txt 逆波兰计算器.txt 逆矩阵.txt 逆阵.txt 递堆法.txt 递归桃猴.txt 递归车厢.txt ...

    精通SQL 结构化查询语言详解

    《精通SQ:结构化查询语言详解》全面讲解SQL语言,提供317个典型应用,读者可以随查随用,针对SQL Server和Oracle进行讲解,很有代表性。 全书共包括大小实例317个,突出了速学速查的特色。《精通SQ:结构化查询语言...

    数据结构及算法C语言实现代码集[推荐下载]

    读写文本文件.c 输出自已.c ./求进制: 16进制10进制.c 二进制数2.c 二进制数.c ./汉诺塔: 四塔1.c 四塔2.c 换位递归.c 汉诺塔2.c 汉诺塔.c 诺汉塔画图版.c 非递归.c ./硬币情况: for循环的.c 硬币分...

    精通SQL--结构化查询语言详解

    2.1.3 使用查询分析器执行sql语句 22 2.2 transact-sql 24 2.2.1 transact-sql 概述 24 2.2.2 transact-sql的主要组成 25 2.2.3 transact-sql的一些重要命令 26 2.3 oracle数据库 29 2.3.1 oracle数据库软件...

    数据结构程序设计.docx

    通过对可视化开发环境的实用,实现对文本文件编辑器的设计。 2).通过键盘实现对文本文件进行创建、插入、删除、修改、存储等操作。 2. 实验任务: 设计一个具有可视化界面的全文本编辑器,通过对键盘操作可实现对...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    2.5 结构化程序设计方法 31 3 数据类型、运算符与表达式 3.1 C语言的数据类型 32 3.2 常量与变量 33 23.2.1 常量和符号常量 33 3.2.2 变量 33 3.3 整型数据 34 3.3.1 整型常量的表示方法 34 3.3.2 整型变量 35 3.4 ...

    Java核心技术II(第8版)

    10.6 文本文件和字符集 10.6.1 源文件的字符编码 10.7 资源包 10.7.1 定位资源包 10.7.2 属性文件 10.7.3 包类 10.8 一个完整的例子 第六章 高级Swing 6.1 列表 6.1.1 JList构件 6.1.2 列表模式 6.1.3 插入和移除值...

    改进K-Means算法在文本聚类中的应用

    要的变量赋予较大的权值,可以有效地解决文本数据的稀疏性、高维性等问题,显著地 提高K一Means算法聚类的准确性,快速发现好的聚类簇,得到一种适合文本数据聚类分 析的改进算法。本文对K一Means算法做了两点重要...

    用c描述的数据结构演示软件

    本系统对屏幕设计的基本原则是集数据结构、算法和其他重要信息(如栈等)于同一屏幕。一般情况下演示屏由图示、算法和变量三个窗口组成,特殊情况下将根据演示内容适当增加。一般情况下, 左侧图示窗口显示演示数据...

    PDF文件自动处理工具Gillmeister Automatic PDF Processor.rar

    可以使用各种特定于配置文件的过滤器缩小要处理的PDF文件的范围,例如文档文本、PDF 元数据或一般文件信息以及创建或最后修改日期,并且包括过滤器设置、存储位置、打印机在内的所有设置都可以特定于配置文件,可以...

    数据结构演示软件

    本系统对屏幕设计的基本原则是集数据结构、算法和其他重要信息(如栈等)于同一屏幕。一般情况下演示屏由图示、算法和变量三个窗口组成,特殊情况下将根据演示内容适当增加。一般情况下, 左侧图示窗口显示演示数据...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    2.5 结构化程序设计方法 31 3 数据类型、运算符与表达式 3.1 C语言的数据类型 32 3.2 常量与变量 33 23.2.1 常量和符号常量 33 3.2.2 变量 33 3.3 整型数据 34 3.3.1 整型常量的表示方法 34 3.3.2 整型变量 35 3.4 ...

    Collector资料收集管理器

    2、添加抓图到文本文件功能,保存时需要转为RTF格式。 3、修正只读打开还能添加数据的问题。 2007-12-29 1、添加书签保存、管理功能 2、修正一个损坏节点问题 3、添加编辑文本的一些功能 4、添加数据库列表功能 5、...

    KODExplorer 芒果云-资源管理器

    - 文本文件编辑 文件名含有url编码则出错bug - 右键菜单在最下面时,右键位置重叠导致点击菜单问题 - 编辑器打开文件时光标问题,处理:移动到行尾;编辑器enter建不显示自动提示 - iframe 打开url 优化。解决...

    人工智能-项目实践-搜索引擎-java实验1-实现搜索引擎的倒排索引数据结构

    如果写文本文件,推荐使用PrintWriter,当创建好PrintWriter对象后,调用其println和print方法可以将字符串一行行的写入到文本文件,使用方法与System.out.println, System.out.print完全一样 具体使用方法,请见...

Global site tag (gtag.js) - Google Analytics