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

结构化文本文件之间的集合运算

阅读更多

JAVA不直接支持集合运算,因此要用嵌套循环才能实现文本文件之间的交集、并集、差集等集合运算,如果文件数量较多,或者文件较大而无法放入内存直接计算,再或者要按照多个字段进行集合运算,则相应的代码会更加复杂。集算器直接支持集合运算,可以协助JAVA轻松实现此类算法,下面我们通过例子来看一下具体作法。

有两个小文件:f1.txtf2.txt,第一行是列名,现在需要对文件中的Name字段进行交集运算。部分数据如下:

 

文件f1.txt:



 

文件f2.txt:



 

 

集算器代码:

 

 

A1B1:用import函数将文件=[A1.(Name),B1.(Name)].isect()读入内存,默认的分隔符是tab。这里的函数选项@t表示将第一行读为列名,这样一来后续的计算就可以直接用NameDept来引用相应的列,如果第一行不是列名,则应当用_1_2这种默认列名来引用。

 

计算后A1B1的值分别如下:



 

函数import可以读取指定的列,比如本案例只有Name会参与计算,因此可以只读取Name列,对应的代码是:file("E:\\f1.txt").import@t(Name)。 

 

A2=函数isect可以进行集合间的交集运算,A1.(Name)表示取出A1Name列,形成一个集合,B1.(Name)表示取出B1Name列。本案例的最终结果如下:



 

A3:result A2。这表示将计算结果输出到JDBC接口。A3可以和A2合为一步:result [A1.(Name),B1.(Name)].isect()

 

 

上述是求交集的过程,求并集只需换个函数[A1.(Name),B1.(Name)].union()计算结果如下:



 

求差集的代码[A1.(Name),B1.(Name)].diff()计算结果如下:



 

还有一类特殊的集合算法:和集,即求并集时保留重复的元素,和集的代码:[A1.(Name),B1.(Name)].conj(),计算结果如下:



 

可以直接用运算符来代替函数,写法更加简洁,比如交集,并集、差集、合集可以改写为:

A1.(Name) ^ B1.(Name)

A1.(Name) & B1.(Name)

A1.(Name) \ B1.(Name)

A1.(Name) | B1.(Name)

也可以对多个文件进行集合运算,比如f1.txtf2.txtf3.txt读入内存后对应的变量分别是A1B1C1,对它们求交集,代码如下: 

A1.(Name) ^ B1.(Name) ^C1.(Name)  [A1.(Name),B1.(Name),C1.(Name)].isect()

 

有时候文件比较大,会影响集合运算的性能,可以用sort函数事先排序,再用merge函数来进行集合运算,这样一来性能会显著提高。其中,求交集时应当使用函数选项@i,并集使用@u,差集使用@d,对应的代码分别如下:

 

=[A1.(Name).sort(),B1.(Name).sort()].merge@i()

=[A1.(Name).sort(),B1.(Name).sort()].merge@u()

=[A1.(Name).sort(),B1.(Name).sort()].merge@d()

 

函数merge还可以进行多字段的集合运算,假设不同的Dept会存在相同的Name,现在需要将DeptName当作一个整体来进行交集运算,对应的代码如下:

[A1.sort(Dept,Name),B1.sort(Dept,Name)].merge@i(Dept,Name)

 

计算结果如下:



 

对于内存放不下的大文件,可以用cursor函数来读取文件,并用merge函数来实现集合运算。其中,求交集的代码如下:

A1=file("e:\\f1.txt").cursor()   
    B1=file(
"e:\\f2.txt").cursor()
    A2=[ A1.sortx(Name),B1.sortx(Name)].merge@xi(Name)             

注意,这里函数cursor并不会将数据全部读入内存,而是以游标(或流)的方式打开文件。集算器引擎会自动分配合适的缓冲区,每次读取一部分数据参与计算,再循环往复,完成最终的计算。

与内存计算不同,操作游标需要使用游标函数,比如排序时应当使用函数sortx。这里的merge函数使用了两个函数选项,@i表示求交集,@x表示参与计算的对象不是内存数据,而是游标。另外,union等函数只能进行内存数据的集合运算,不能用于大文件。

 

         上述脚本已经完成了所有的数据处理工作,接下来通过JDBC将集算器脚本集成在JAVAJAVA代码如下:

         //建立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();//获得计算结果

  • 大小: 9.1 KB
  • 大小: 8.6 KB
  • 大小: 18.9 KB
  • 大小: 31.5 KB
  • 大小: 7.2 KB
  • 大小: 9.1 KB
  • 大小: 3.2 KB
  • 大小: 14.7 KB
  • 大小: 10.2 KB
0
0
分享到:
评论
2 楼 datamachine 2015-03-23  
m635674608 写道
收费的吧???不是开源的吧??

有免费版,此处下载:http://www.raqsoft.cn/?p=2643。
1 楼 m635674608 2015-03-20  
收费的吧???不是开源的吧??

相关推荐

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

    9.4.1 关系的集合运算  9.4.2 UNION运算符  9.4.3 ORDER BY子句排序UNION运算结果  9.4.4 对多表进行UNION运算  9.4.5 UNION JOIN 连接表  9.5 表连接的其他应用及注意问题  9.5.1 连接表进行聚合运算...

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

    9.4.1 关系的集合运算 177 9.4.2 union运算符 178 9.4.3 order by子句排序union运算结果 180 9.4.4 对多表进行union运算 181 9.4.5 union join 连接表 183 9.5 表连接的其他应用及注意问题 183 9.5.1 连接表...

    14 python 文件

    数据格式化:将一组数据按照一定的规格和式样进行规范,包括数据的辨识、储存、运算等 文件 1.文件概述 文件是数据的抽象和集合 文件的展现形态:文本文件,二进制文件 文本文件:由单一特定编码组成,如utf-8编码 ...

    Ruby编程语言

    本书还包含对Ruby平台上丰富的API的详尽介绍,并用带有详尽注释的代码演示了Ruby进行文本处理、数字运算、集合、输入/输出、网络开发和并发编程的功能。  前言1  第1章导言1  1.1漫游RUBY2  1.2体验RUBY11  ...

    C语言程序设计标准教程

    6. 把一个文本文件读入内存时,要将ASCII码转换成二进制码, 而把文件以文本方式写入磁盘时,也要把二进制码转换成ASCII码,因此文本文件的读写要花费较多的转换时间。对二进制文件的读写不存在这种转换。 7. 标准...

    C# 程序设计手册(WORD)

    一次一行读取文本文件 (Visual C#) 516 在登录中建立机码 (Visual C#) 517 写入应用程序事件记录文件 (Visual C#) 518 互操作性 518 使用平台调用播放 WAV 檔 520 范例 COM 类别 523 线程 524 使用线程 525 线程同步...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例214 启动默认文本工具 269 实例215 简单的截图软件 270 第10章 Commons组件 272 10.1 Commons Lang组件简介 273 实例216 数组元素的增加 273 实例217 数组元素的删除 274 实例218 生成随机字符串 275 实例219 ...

    python cookbook(第3版)

    5.17 将字节写入文本文件 5.18 将文件描述符包装成文件对象 5.19 创建临时文件和文件夹 5.20 与串行端口的数据通信 5.21 序列化Python对象 第六章:数据编码和处理 6.1 读写CSV数据 6.2 读写JSON数据 6.3 ...

    Visual Basic 2010入门经典.part1.rar

    15.4 使用Try...Catch...Finally创建结构化错误处理程序 251 15.4.1 处理异常 253 15.4.2 处理预期的异常 254 15.5 总结 256 15.6 问与答 256 15.7 作业 257 15.7.1 测验 257 15.7.2 答案 257 15.7.3 练习 ...

    Visual Basic 2010入门经典.part2.rar

    15.4 使用Try...Catch...Finally创建结构化错误处理程序 251 15.4.1 处理异常 253 15.4.2 处理预期的异常 254 15.5 总结 256 15.6 问与答 256 15.7 作业 257 15.7.1 测验 257 15.7.2 答案 257 15.7.3 练习 ...

    Delphi5开发人员指南

    12.1.1 文本文件的处理 344 12.1.2 类型文件的处理 348 12.1.3 无类型文件的处理 356 12.2 TTextRec 和TFileRec结构 359 12.3 内存映射文件 360 12.3.1 内存映射文件的应用 360 12.3.2 使用映射文件 361 12.3.3 内存...

    面向对象技术与UML课件及源代码-by 南邮-陈杨

    7.6.2文档的使用 7.7小结 第8章实验指导2 8.1单例模式的设计 8.1.1需求简介 8.1.2不用单例模式的效果 8.1.3最原始的单例模式 8.1.4首次改进 8.1.5再次改进 8.1.6思考题 8.2利用继承和多态扩充程序功能 ...

    数据结构(C++)有关练习题

    e. 如有可能,请建立一个存储商品名称和数量的文本文件,并为二叉搜索树建立一个成员函数SetupInventory(),用于从该文本文件中读取库存商品的数据, 实验报告要求: 1、 按要求记录下二叉搜索树的完整实验...

    1345个易语言模块

    1345个易语言模块,易语言模块大集合,够你用的啦 1亦思验证码识别1.5免费版.ec 24位转单色位图模块.ec 32张发牌.ec 3D引擎支持库-eOgre.ec 69msn.ec ACCESS 到高级表格.ec Access操作.ec Access数据库压缩修复新建....

    C#微软培训资料

    18.4 代 码 优 化 .252 18.5 小 结 .254 第五部分 附 录 .255 附录 A 关 键 字.255 附录 B 错 误 码.256 附录 C .Net 名字空间成员速查.269 参 考 资 料 .300 <<page 4>> page begin==================...

Global site tag (gtag.js) - Google Analytics