JAVA不直接支持集合运算,因此要用嵌套循环才能实现文本文件之间的交集、并集、差集等集合运算,如果文件数量较多,或者文件较大而无法放入内存直接计算,再或者要按照多个字段进行集合运算,则相应的代码会更加复杂。集算器直接支持集合运算,可以协助JAVA轻松实现此类算法,下面我们通过例子来看一下具体作法。
有两个小文件:f1.txt和f2.txt,第一行是列名,现在需要对文件中的Name字段进行交集运算。部分数据如下:
文件f1.txt:
文件f2.txt:
集算器代码:
A1、B1:用import函数将文件=[A1.(Name),B1.(Name)].isect()读入内存,默认的分隔符是tab。这里的函数选项@t表示将第一行读为列名,这样一来后续的计算就可以直接用Name和Dept来引用相应的列,如果第一行不是列名,则应当用_1和_2这种默认列名来引用。
计算后A1和B1的值分别如下:
函数import可以读取指定的列,比如本案例只有Name会参与计算,因此可以只读取Name列,对应的代码是:file("E:\\f1.txt").import@t(Name)。
A2=函数isect可以进行集合间的交集运算,A1.(Name)表示取出A1的Name列,形成一个集合,B1.(Name)表示取出B1的Name列。本案例的最终结果如下:
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.txt、f2.txt、f3.txt读入内存后对应的变量分别是A1、B1、C1,对它们求交集,代码如下:
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,现在需要将Dept和Name当作一个整体来进行交集运算,对应的代码如下:
[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将集算器脚本集成在JAVA里。JAVA代码如下:
//建立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();//获得计算结果
相关推荐
2. 基本要求:系统应具备文本编辑的基本功能,如文字输入、保存、撤销/重做,以及集合运算如合并两个文档、找出文档间的共同部分或唯一部分。 3. 需求分析:首先,需要识别和定义用户的需求,包括文本编辑的便利性...
- **Input运算器组**:为算法提供输入的运算器,如文件路径、数据列表等。 - **Util组**:提供额外工具的运算器,如布尔运算、几何变换、排序、插值等。 - **Math组**:包含数学运算的运算器,如加减乘除、三角...
### Fortran77结构化程序设计 #### 第一章 算法 ##### 1.1 概念 - **定义**:算法是一系列解决特定问题的清晰指令集。 - **目的**:为了有效地解决问题而制定的一套有序的步骤。 ##### 1.2 算法举例 - **示例**:...
### 结构化查询语言SQL习题与答案解析 #### 第四章 结构化查询语言SQL 本章节通过一系列的选择题来考察学习者对于SQL基础知识的理解程度。以下是对这些选择题的详细解析,以便帮助理解SQL的基本概念和常用操作。 ...
在提供的压缩包中,`www.pudn.com.txt`可能是包含源代码、说明或其他资源的文本文件,而`矩阵运算`可能是一个包含了各种矩阵运算实现的源代码文件。通过阅读和研究这些代码,可以深入理解上述知识点,并且能够运用到...
它们可以包含任何类型的数据,如图片、音频、视频或结构化的数据包。在易语言中,字节集通常用作存储和传递这种非文本信息的媒介。 "字节集文本化"的过程,实际上就是将字节集中的数据转换为字符串,这涉及到字符...
批处理是一种在计算机领域中广泛使用的自动化工具,尤其在DOS操作系统和Windows系统中,它通过将一系列命令组合成一个文本文件(通常扩展名为.BAT或.CMD)来实现批量执行任务,极大地提高了工作效率。本批处理集合...
2. 预处理模块:将文本信息转换为计算机可以处理的结构化信息。预处理过程可能包括分词、去除停用词、词干提取等。 3. 特征选择模块:该模块使用特征选择算法从特征集合中选取最能体现类别信息的特征,形成最佳特征...
数据格式化:将一组数据按照一定的规格和式样进行规范,包括数据的辨识、储存、运算等 文件 1.文件概述 文件是数据的抽象和集合 文件的展现形态:文本文件,二进制文件 文本文件:由单一特定编码组成,如utf-8编码 ...
4. 集合与数组运算: 易语言中的集合和数组是处理大量数据的有效手段。集合可以进行成员测试、合并、交集、差集等操作,而数组则允许按索引访问和修改元素。这些数据结构在算法设计和数据处理中扮演着重要角色。 5....
2. **文本文件**: 纯文本文件只包含可见字符和控制字符(如回车和换行),不包含任何格式化信息。 **解答:** 此题的答案为 **正确**。**TXT** 扩展名确实用于纯文本文档。 --- #### 题目3:HTML多行文本输入域 *...
文档建模是指将文档转换为计算机可以处理的结构化数据,文档建模的方法包括布尔模型、向量空间模型(VSM)和概率模型。其中最为广泛使用的是向量空间模型(VSM),它可以把对文本内容的处理简化为向量空间中的向量...
标题中的"C代码 生成曼德布罗特集合的 ASCII 文本图像,仅使用两行 C 代码"指的是一项利用C语言编写的程序,该程序能够以ASCII字符的形式绘制著名的曼德布罗特集合。曼德布罗特集合是复数平面上的一个点集,具有复杂...
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 连接表...
MATLAB脚本通常以.m为扩展名,是文本文件,可以直接在MATLAB环境中运行。 MATLAB源码的基本结构通常包括变量定义、函数定义、控制结构(如循环和条件语句)、数学运算以及数据处理等部分。以下是一些可能包含在这些...
1. **结构化编程**:C语言支持结构化编程概念,通过函数、循环和选择结构,可以组织代码,使程序结构清晰易懂。 2. **低级特性**:C语言提供了指针操作,可以直接访问内存,这在处理硬件交互和系统级编程时非常有用...
8. **文件输入输出**:Matlab可以读取和写入各种文件格式,如文本文件(`textscan`,`fprintf`),二进制文件(`fwrite`,`fread`),以及数据文件(`load`,`save`)。 9. **数组函数与运算**:包括元素级运算(如...
- **for**: 构成循环结构,通过初始化表达式、条件表达式和迭代表达式来控制循环。 - **goto**: 提供无条件跳转,可从一处跳转到另一处标号,但过度使用可能导致代码难以理解和维护。 - **if**: 实现基本的选择结构...