直接用Java实现文本文件中数据按条件过滤会有如下的麻烦:
1、文件不是数据库,不能用SQL访问。当过滤条件变化时需要改写代码。如果要实现象SQL那样灵活的条件过滤,则需要自己实现动态表达式解析和求值,编程工作量非常大。
2、文件太大时不能一次性装入内存处理,而采用逐步读入方式在考虑到性能时又会涉及到文件缓冲区管理、拆行计算等复杂编程。
使用集算器来辅助Java编程,这些问题都不需要自己写代码解决。下面我们通过例子来看一下具体作法。
文本文件employee.txt中保存了员工数据。我们要读取员工信息,从中找出1981年1月1日(含)之后出生的女员工。
文本文件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那样,灵活的过滤文本文件中的数据。
例如,我们需要查询1981年1月1日(含)之后出生的女员工,esProc程序可以从外部获得一个输入参数“where”作为条件,如下图:
where是个字串,取值是:BIRTHDAY>=date(1981,1,1) && GENDER=="F"。
esProc代码如下:
A1:定义一个file对象,读入数据,第一行是标题,字段分隔符默认是tab。esProc的集成开发环境可以直观的显示出导入的数据,如上图右边部分。
A2:按照条件过滤。这里使用宏来实现动态解析表达式,其中的where就是传入参数。集算器先计算${…}里的表达式,将计算结果作为宏字符串值替换${…}之后解释执行。这个例子中最终执行的是:=A1.select(BIRTHDAY>=date(1981,1,1) && GENDER=="F")。
A3:向外部程序返回符合条件的结果集。
过滤条件发生变化时不用改变代码,只需改变where参数即可。例如,条件变为:查询1981年1月1日(含)之后出生的女员工,或者NAME+SURNAME等于”RebeccaMoore”的员工。Where的参数值可以写为:BIRTHDAY>=date(1981,1,1) && GENDER=="F" || NAME+SURNAME=="RebeccaMoore"。执行之后,A2中的结果集如下图:
在Java程序中使用esProc JDBC调用这段程序获得结果的代码如下:(将上述esProc程序保存为test.dfx):
//建立esProc jdbc连接
Class.forName("com.esproc.jdbc.InternalDriver");
con= DriverManager.getConnection("jdbc:esproc:local://");
//调用esProc 程序(存储过程),其中test是dfx的文件名
st =(com.esproc.jdbc.InternalCStatement)con.prepareCall("call test(?)");
//设置参数
st.setObject(1," BIRTHDAY>=date(1981,1,1) && GENDER==\"F\" ||NAME+SURNAME==\"RebeccaMoore\"");//参数就是动态的过滤条件
//执行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\").import@t().select(BIRTHDAY>=date(1981,1,1)&&GENDER==\"F\" || NAME+SURNAME==\"RebeccaMoore\")");
这段Java代码直接调用了集算器的一句脚本:从文本文件中取得数据,并按照指定的条件过滤。结果集返回给ResultSet对象set。
上面方法中假定文件较小,可以全部读入内存。但实际上可能发生文件较大无法读入内容的情况,而且即使可以读入也没必要占太多内存,这时可以使用文件游标的方式来处理。集算器程序调整如下:
A1:定义一个file对象游标,第一行是标题,字段分隔符默认是tab。
A2:按照条件过滤游标。这里使用宏来实现动态解析表达式,其中的where就是传入参数。集算器将先计算${…}里的表达式,将计算结果作为宏字符串值替换${…}之后解释执行。这个例子中最终执行的是:=A1.select(BIRTHDAY>=date(1981,1,1) && GENDER=="F")。
A3:返回游标
虽然集算器给Java返回的是游标,但是Java调用的程序不用修改。在Java使用ResultSet遍历数据的时候集算器会自动取出游标对应的内容。
如果需要将过滤后的数据写入另一个文件而不是返回给主程序,只要将A3格的表达式改成:=file("D:/employee_group.txt").export@t(A2)即可,集算器将把游标数据写出成文件。
相关推荐
7. **注意事项**:在进行文本过滤时,需要注意不要误删重要信息,尤其是在处理非结构化数据时,确保过滤规则的准确性和灵活性是至关重要的。同时,如果涉及到个人隐私或敏感信息,必须遵循相关的数据保护法规。 8. ...
其次,Weaviate支持结构化过滤,这意味着用户可以通过SQL-like查询语法(GraphQL和REST接口)同时对矢量数据和结构化属性进行筛选。这种结合使得开发者可以灵活地根据既定条件限制搜索范围,进一步优化查询性能。 ...
在IT领域,尤其是在数据分析、日志处理或自动化脚本编写中,熟练掌握操作结构化文本数据的命令行工具是至关重要的。"用于操作结构化文本数据的命令行工具列表" 提供了一系列这样的工具,帮助用户在终端环境中高效地...
非结构化数据是指无法用数字或统一的结构表示的数据,如文本、图像、声音、网页等。 在数据仓库中,数据清洗是一个非常重要的步骤。数据清洗就是把“脏”的“洗掉”,即将不符合要求的数据过滤出来,并将过滤的结果...
第十三章:半结构化文本挖掘方法,如XML文档的处理,由于XML具有一定的结构,因此在保持结构的同时进行文本挖掘更具挑战性。本章探讨了如何在向量空间模型中表示XML结构,以及如何处理结构化查询。 第十四章:文本...
1. "过滤日志.application" 可能是主应用程序文件,用户可以通过运行它来启动文本过滤和导出功能。 2. "setup.exe" 通常是一个安装程序,用户可以执行此文件来安装软件到他们的电脑上。 3. "test.txt" 是一个测试...
总的来说,这个压缩包提供了一个完整的PowerBuilder实现多条件过滤和排序功能的实例,对于初学者来说,可以通过学习这个实例来掌握PB中的数据处理技巧,了解如何在实际项目中灵活应用。同时,对于有经验的开发者,它...
在本文中,我们将探讨如何使用DFA(有穷自动机)算法在Java中实现敏感词过滤功能。敏感词过滤在许多应用程序中都是必要的,例如社交媒体、论坛或博客平台,以防止用户发布不当或有害的内容。以下是对DFA算法及其在...
### 网页挖掘、超文本与半结构化数据分析技术 #### 一、网页挖掘概述 网页挖掘(Web Mining)是指从互联网上的网页内容、结构和使用模式中自动提取有用的信息和知识的过程。随着互联网的发展,网页数据量呈爆炸式...
本篇将深入探讨四个重要的知识点:`choose`函数实现条件筛选、数组广播机制、数组读写以及结构化数组。这些概念对于任何想在Python中进行数据分析或科学计算的人来说都至关重要。 首先,我们来看`choose`函数。...
这个主题“易语言过滤文本只保留数字”就是关于如何在易语言中编写程序,实现对文本进行处理,只保留其中的数字,去除其他非数字字符。 首先,我们需要理解易语言中的字符串操作函数。字符串在易语言中是用双引号括...
但与此同时,网络信息的海量性和非结构化特性也给信息的有效收集与处理带来了挑战。 #### 文章核心内容概述 本文提出了一种结合文本挖掘和信息可视化的新型竞争情报提取系统,旨在克服传统竞争情报系统存在的不足...
总的来说,`IEHelper`是VC++编程中实现网址过滤的一个实例,它体现了如何利用C++语言特性结合网络技术,实现对互联网访问的有效管理。通过深入理解其工作原理和实现方式,我们可以定制更复杂、更个性化的URL过滤方案...
结构化文本工具是程序员、数据分析师以及任何处理结构化数据的人都不可或缺的利器。这些工具主要在命令行界面(CLI)中运行,适用于多种格式的数据,包括HTML、CLI、YAML、TOML、TSV、JSON、List、CSV、XML等。在...
文本挖掘是一种从非结构化文本数据中提取有价值信息的技术,广泛应用于多个领域,如生物技术、消费者产品、CRM、市场营销、教育、政府、医疗保健、保险等。在本北京大学研究生课程“文本挖掘”中,涵盖了从基础知识...
首先,PDF转TXT是将非结构化的PDF文档转换为结构化文本的关键步骤。在Python中,可以使用`PyPDF2`库来读取PDF文件,然后通过逐页提取文本内容,最终整合成一个或多个TXT文件。这个过程有助于将复杂的PDF布局转化为...
【Python文本特征抽取与向量化算法】是自然语言处理领域中的关键步骤,它涉及将非结构化的文本数据转化为机器学习模型可理解的数值形式。在处理文本数据时,首要任务是将文本信息提取成有意义的特征,然后进行向量化...