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

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

阅读更多

直接用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
分享到:
评论

相关推荐

    英文文本单词分类排序

    为解决此问题,可以使用流式处理(streaming)或外部排序(external sorting),将大文件分成小块处理,然后再合并结果。 7. **优化与效率**: 提高效率的关键在于优化。例如,通过使用位图(Bitset)存储单词出现...

    基于注意力机制的结构化文本自动生成.docx

    总结来说,基于注意力机制的结构化文本自动生成技术结合了正则表达式的数据处理、Bert模型的语义理解以及TextRank的文本排序,为招标文件的自动化生成提供了一套有效的解决方案。这种方法不仅能够节省人力资源,提高...

    易语言文本数组排序模块测试程序源码,易语言文本数组排序模块源

    通过学习和掌握这一模块,开发者不仅可以提升编程技能,还能更好地解决实际问题,提高软件的用户体验。对于初学者而言,通过研究"易语言文本数组排序模块源码",可以深入理解排序算法,对于进阶开发者,则可以借鉴...

    易语言源码易语言文本排序源码.rar

    6. **结果输出**:排序完成后,使用`写文件`函数将排序后的结果写回至文本文件。 在学习易语言文本排序源码时,可以深入理解排序算法的原理,同时掌握易语言的文件操作、数据结构和算法应用等知识。通过实际的编程...

    易语言文本数组排序

    在这个例子中,我们看到一个名为"系统结构:文本数组排序"的程序集,它包含了三个子程序:"_启动子程序"、"_临时子程序"以及"文本数组排序"。这表明我们的排序功能将主要在"文本数组排序"子程序中实现,而其他两个子...

    易语言源码文本数组排序.rar

    文本数组可以用来处理大量文本数据,例如处理文本文件、进行字符串操作等。数组的排序是编程中常见的操作,对文本数组进行排序有助于我们更高效地管理和分析数据。 三、文本数组排序算法 1. 冒泡排序:是最简单的...

    易语言文本数组随机打乱排序源码

    易语言提供了丰富的库函数来支持这些操作,例如`读文件文本`和`写文件文本`等。 总的来说,理解和掌握易语言的文本数组操作以及随机数生成是编程中的基础技能,它们在许多场景下都十分有用。通过练习和实践,你可以...

    山东大学数据结构课程设计第一部分代码——外排序

    8. **文件比较器**:在开发和测试过程中,文件比较器用于验证排序结果的正确性,通过对比排序前后的文件,确保算法的准确性。 9. **文档说明**:项目中的"算法设计.md"和"README.md"、"README.pdf"等文件可能详细...

    数据结构 课程设计 图形界面 文本编辑器 源码

    通过这个课程设计,学生不仅能巩固数据结构的知识,还能提升实际编程技能,了解如何将理论应用于解决实际问题。同时,对于软件工程的理解也会有所加深,包括版本控制、测试和文档编写等。总的来说,这是一个综合性的...

    结构化文本工具:用于处理结构化文本数据的命令行工具列表

    结构化文本工具是程序员、数据分析师以及任何处理结构化数据的人都不可或缺的利器。这些工具主要在命令行界面(CLI)中运行,适用于多种格式的数据,包括HTML、CLI、YAML、TOML、TSV、JSON、List、CSV、XML等。在...

    qt文件读取,数据排序

    在这个“qt文件读取,数据排序”的项目中,我们将探讨如何使用Qt来读取文件,处理数据,并对数据进行排序。C语言作为基础,与Qt相结合,为开发者提供了强大的功能和灵活性。 首先,让我们了解如何在Qt中读取文件。...

    行业分类-设备装置-一种结构化数据和非结构化数据综合检索的系统及方法.zip

    "一种结构化数据和非结构化数据综合检索的系统及方法"旨在解决如何有效地整合这两类数据,实现高效检索的问题。这样的系统通常会包含以下几个关键技术环节: 1. 数据集成:首先,系统需要具备集成各种不同类型数据...

    C 使用单链表 读文件,并排序 Linux

    此外,为了测试程序的正确性,可以使用不同数据集进行验证,例如多个具有不同排序顺序的文本文件。 总之,这个项目涉及到了C语言的基本操作,包括文件处理、链表操作以及排序算法的应用,这些都是IT专业人士必须...

    html列表图形化排序

    同时,它也会更新DOM(文档对象模型)以反映新的排序。 3. **jQuery插件与库**:许多现有的JavaScript库如jQuery提供了方便的插件,如jQuery UI中的"Sortable",可以帮助开发者快速实现拖放排序功能。这些插件处理...

    文本文件整理工具TextModify.rar

    文本文件整理工具TextModify是一款专为处理和优化文本文件而设计的应用程序,它可以帮助用户高效地管理和编辑大量的文本数据。这个RAR压缩包包含了该工具的主要执行文件,名为"TextModify",用户解压后即可使用。 ...

    C语言的单词排序

    在IT领域,编程是解决问题的关键工具之一,C语言作为一种基础且强大的系统级编程语言,被广泛用于各种软件开发。本项目聚焦于C语言实现的一个特定任务:对文本中的单词进行排序和计数。这个任务涉及到文件操作、字符...

    数据结构文本转换数值求解

    通常,文本数据是非结构化的,如字符串形式的单词或句子。为了用于计算,我们需要将这些文本转化为数值表示。一种常见的方法是词袋模型(Bag-of-Words Model),它不考虑词语的顺序,只关心词语出现的频率。通过词频...

    文本编辑器的设计

    【文本编辑器设计】\n\n在IT领域,文本编辑器是开发人员和普通用户日常工作中不可或缺的工具,用于创建、修改和查看各种文本文件。设计一个文本编辑器需要掌握多方面的技能,包括用户界面设计、文件操作以及编程语言...

    S7-200SMART冒泡排序源程序及库文件(可重复调用).rar

    S7-200SMART支持Ladder Logic(梯形图)、Structured Text(结构化文本)以及Instruction List(指令表)等编程语言,使得开发者可以根据项目需求选择合适的编程方式。 冒泡排序是一种简单的排序算法,它的基本思想...

    一个简单的读取二进制文件并进行排序

    与文本文件不同,二进制文件不以人类可读的形式存储数据,而是以计算机可以直接理解和处理的0和1形式。这种格式通常用于存储结构化数据,如图像、音频、数据库记录等,因为它能更有效地利用磁盘空间并提高读写速度。...

Global site tag (gtag.js) - Google Analytics