直接用Java实现文体文件分组汇总会有如下的麻烦:
1、文件不是数据库,不能用SQL访问。当分组、汇总表达式变化时,只能改写代码。而要实现灵活表达式的话,需要自己实现动态表达式解析和求值,编程工作量非常大。
2、遍历过程中记录分组结果,结果小了还可以存在内存中,如果分组结果太大时要将中间结果缓存进临时文件再归并,实现过程非常复杂。
使用集算器辅助Java编程,这些问题都有现成的类库可以解决。下面,我们通过例子来看一下具体作法。
文本文件employee.txt中保存有员工信息,我们要按照DEPT分组,求出每组的员工个数COUNT和薪酬SALARY总额。
文本文件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程序。由于集算器支持动态表达式解析和求值,使得Java程序可以像使用sql那样,灵活的处理文本文件中的数据。
例如,我们需要按照DEPT分组,求出每组的员工个数COUNT和薪酬SALARY总额,esProc程序可以从外部传入一个输入参数“groupBy”作为动态的分组和汇总条件,如下图:
“groupBy”的值是:DEPT:dept;count(~):count,sum(SALARY):salary。esProc代码如下:
A1:定义一个file游标对象,第一行是标题,字段分隔符默认是tab。esProc的集成开发环境可以直观的显示出导入的数据,如上图右边部分。
A2:按照指定字段分组汇总。这里使用宏来实现动态解析表达式,其中的groupBy就是传入参数。集算器将先计算${…}里的表达式,将计算结果作为宏字符串值替换${…}之后解释执行。这个例子中最终执行的是:=A1.groups(DEPT:dept;count(~):count,sum(SALARY):salary)。
A3:向外部程序返回符合条件的结果集。
分组字段发生变化时不用改代码,只需改变groupBy参数即可。例如,分组变为:按照DEPT和GENDER两个字段分组,求出每组的员工个数COUNT和薪酬SALARY总额。groupBy的参数值可以写为:DEPT:dept,GENDER:gender;count(~):count,sum(SALARY):salary。
针对所有数据的简单汇总计算可以看作是分组汇总的一种特殊情况。例如:要统计全部员工的个数和薪酬总数,这时可将groupBy参数值写为:;count(~):count,sum(SALARY):salary,即分组的部分填空,相当于把所有数据只分成一个组。这样做的好处是可以一次遍历计算出这批数据的多个汇总值。
在Java程序中通过集算器的jdbc调用这段esProc程序(保存为test.dfx文件)的代码如下:
//建立esProc jdbc连接
Class.forName("com.esproc.jdbc.InternalDriver");
con= DriverManager.getConnection("jdbc:esproc:local://");
//调用esProc 程序(存储过程),其中test是dfx的文件名
com.esproc.jdbc.InternalCStatement st;
st =(com.esproc.jdbc.InternalCStatement)con.prepareCall("call test(?)");
//设置参数
st.setObject(1,"DEPT:dept,GENDER:gender;count(~):count,sum(SALARY):salary");//参数就是动态的分组汇总字段
//执行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().groups(DEPT:dept,GENDER:gender;count(~):count,sum(SALARY):salary)");
这段Java代码直接调用了集算器的一句脚本:从文本文件中取得数据处理后,结果集返回给ResultSet对象set。
如果分组结果集还是比较大而不能在内存装入,则要使用groupx语句用文件游标的方式返回分组结果。集算器代码将调整如下:
groups函数把分组汇总的结果完全放在内存中,而groupx则当分组汇总结果大于缓冲行数的时候会把结果写入临时文件,并重新利用内存。之后,groupx再将生成的临时文件归并。这里的参数1000000就是指缓冲行数,取值原则是充分利用内存,以尽量减少缓存文件的数量。这个数量和物理内存大小及记录本身的大小都有关,需要编程时估算,一般建议在几十万到上百万的量级。
虽然A3单元格给Java返回的不是结果集而是游标,但是Java调用的程序不用修改。在Java使用ResultSet遍历数据的时候集算器会自动读取游标对应的内容。
这段程序可以再完善以支持分组前和分组后过滤,类似SQL中的where和having。例如:统计对象变为只统计女员工(GENDER=="F"),并且分组汇总之后,只保留女员工个数大于10的部门。具体代码如下:
为了方便理解,这里没有再使用网格参数,实际上写法和前述代码是一样的:A2.groupx(${groupBy})。select函数的参数也可以写成宏,从Java程序中传进来。
相关推荐
<br>怎样把一个文本文件中的各行指定位置上的数字按一定规则分组汇总,怎么做?怎样从一个文本文件中筛选出含有或不含一组字符串的行?怎样直接编辑与保存剪贴板中的文本内容?怎样删除一个文件中所有多于一个的...
本文将深入探讨如何在VFP中实现报表的动态分组功能,这在数据汇总和展示时非常实用。 动态分组报表允许用户根据需求自由地改变报表的分组方式,无需重新设计整个报表。在VFP中,我们可以通过报表设计工具和编程来...
在"自动汇总表【Powerquery】.xlsx"文件中,可能包含了以下步骤来实现自动汇总的功能: 1. **加载源数据**:首先,你需要从Excel工作簿中的一个或多个表格或者外部数据源(如CSV、数据库等)加载数据。在Power ...
这个名为"EXCE数据分类汇总分析.rar"的压缩包文件包含了一个名为"EXCEL第3章 数据分类汇总分析"的文件,很可能是某个教程或学习资料的一部分,专注于讲解如何在Excel中对数据进行有效分类和汇总。 首先,我们要了解...
本项目是一个基于Java语言开发的Sagacity SQLToy数据库查询优化工具,包含420个文件,主要文件类型包括Java源代码、XML配置文件、BAT批处理文件、文本文件、Git忽略文件、Markdown文档、图片、属性文件和XSD文件。...
根据提供的文件信息,我们可以了解到这份文档是关于BOM(物料清单)汇总的SQL查询语句。这段SQL查询语句主要用于统计一个项目中所有采购件的数量,并采用了递归算法来实现。接下来,我们将对这段SQL查询语句进行详细...
分类汇总则是对数据进行统计分析的一种方法,它将数据按照一个或多个分类字段进行分组,并对每个组进行总计或其他统计计算(如平均值、最大值、最小值等)。在Excel中,用户可以通过“数据”菜单的“分类汇总”功能...
4. 分组汇总:每个分组可以添加自己的汇总行,通过内置的计算函数(如SUM, AVG, COUNT等)对组内数据进行统计。 四、报表分组训练中的常见问题及解决方法 1. 数据不按预期分组:检查分组表达式是否正确,确认字段...
【ireport资料汇总】 在Java开发领域,报表生成是一个至关重要的任务,而iReport作为一款强大的报表设计工具,被广泛应用于各种项目中。它与JasperReports库紧密结合,提供了直观的用户界面,使得非程序员也能设计...
在您提供的信息中,"参考资料-01、试验汇总表.zip" 是一个压缩文件,通常用于存储和传输数据或文档。这个压缩包内包含了一个名为 "01、试验汇总表.xls" 的文件,这很可能是一个Excel电子表格,用于记录和分析实验...
在本文档中,我们将对Tkinter的组件进行汇总,包括Label、Button、Frame、Checkbutton、Radiobutton和LabelFrame等。 Label组件: * 用于显示文本和图像 * 可以指定想要显示的内容(文本、位图或者图片) * 可以...
10、特有的分组单元格合并功能,轻松实现常见的中国式报表分组在列中展现并垂直居中要求。 11、全中文界面,针对中国式报表进行了很多专门实现,如:表格报表、财务金额线、大写金额、发票圈叉图标、负数红字、多层...
导入文本文件 该部分代码实现了从外部导入.txt文件的功能。具体步骤如下: - **选择文件**:首先通过`GETFILE`函数弹出文件选择对话框,让用户选择一个.txt文件。 ```vba sFile$ = GETFILE("ѡıļ", "txtıĵ",...
2. 文件的类型:文本文件、二进制文件等。 3. 异常处理:try、except、finally等。 正则表达式 1. 正则表达式的基本语法:模式、匹配、分组等。 2. 正则表达式的应用:字符串匹配、文本处理等。 Web开发 1. ...
这个“html前端学习文档汇总.zip”压缩包显然包含了一系列关于HTML学习的资源,旨在帮助初学者或者希望深化理解的开发者系统地掌握HTML。 HTML文档结构通常包括头部(head)和主体(body)。头部主要用于存放元数据...
源码的核心功能是将数据导入到数据库中,这一步通常涉及读取外部数据源,如CSV、Excel或文本文件,然后使用易语言的数据接口将这些数据批量写入数据库。数据导入能极大地减少手动输入的工作量,特别是面对大量数据时...
首先,我们打开“按月汇总订单数量.xlsx”这个文件,通常这份模板会包含一个或多个工作表,其中含有订单数据。这些数据可能包括订单日期、订单编号、商品名称、购买数量等字段。为了进行按月汇总,我们需要对订单...
5. **文本文件——安网软件.txt** 这个文件可能是安全相关的提示或建议,指导用户如何安全地安装和配置MySQL。内容可能涉及设置强密码策略、限制网络访问、定期备份数据以及启用日志记录等最佳实践。 学习MySQL,...