集算器能够协助java处理结构化文本的各种计算工作,但碰到非单行记录的情况就不能直接计算了,这时需要先进行一些必要的变换处理。
比如,文本文件Social.txt中存储着网站的访问记录,每三行对应一条记录,现在需要整理出这些记录,再进行下一步的计算。记录需要按(UserID, Time, IP, URL, Location)的格式取出使用或存放在文件中。注意:列分隔符是tab,行分割符是回车换行,前几行数据如下:
该文件每三行对应一条记录,其中第一行的IP、URL、Time是有用数据,第二行数据无用,第三行的UserID和Location是有用数据。比如,第一条记录应当是(UserID, Time, IP, URL, Location)=(47356, 2013-04-01 21:14:44, 10.10.10.143, /p/pt301/index.jsp, Chicago)。记录整理的过程如下:
集算器代码:
代码解读:
A1:file("E:\\Social.txt").import@t()
这句代码用来将文本文件一次性读入序表对象中,如下:
可以看到,A1只有一列,列名是默认的“_1”,文本文件中的每一行对应“_1”中的一条数据。
A2:A1.select(#%3==1)
这句代码用来按行号取每三行中的第一行,比如第1、4、7、10行,其中#是行号,%是取余数,select函数可对序表按字段名或行号进行查询。执行后结果如下。
B2:A1.select(#%3==0)
类似地,这句代码用来取每行中的第三行,比如第3、6、9、12行,结果如下:
经过上面几步,每条记录的第一行和第三行就分别存在了序列A2和B2中。它们行数相等,行号互相对应,只是尚未拆分。
L1=A2.(_1.array("\t"))
这表示将每条记录的第一行拆分为字符串序列,并将该序列起名为L1,“\t”表示以tab为分隔符。结果如下:
如上图,L1中的每个成员对应一个字符串序列,点击蓝色超链接可以看到序列子成员。每条记录的第三行也用类似的方式处理,代码是:=L3=B2.(_1.array("\t")),取名为L3,结果如下图:
下面,我们把L1和L3中需要的字段拼在一起,形成一个新的序表:
pjoin(L1,L3).new(_2(1):UserID, _1(2):Time, _1(1):IP, _1(4):URL, _2(3):Location)
计算结果如下:
函数pjoin用来将L1和L3按照序号进行横向拼接,拼接后L1的默认名是_1,L3的默认名是_2。函数new用来生成新的序表,其中_2(1):UserID表示将L3中每个成员的的第1个子成员取出来,拼接后改名为字段“UserID”,以此类推。
A4就是整理出来的可用记录,如果需要将记录存入文件,只需用一句:=file("E: \\result.txt").export@t(A4)。这里的函数选项@t表示将字段名存入文件的第一行。
也可以对A4按照以前的方式进行结构化数据计算,比如:按地区分组汇总,求得每个地区的访问量,并过滤出访问量大于某个值(比如百万)的地区,最后将计算结果输出到JDBC。代码如下:
=A4.groups(Location;count(~):pv)
这句代码用来按地区分组汇总,求得每个地区的访问量。
=A5.select(pv>=@arg) //@arg是输入参数,比如1000000。
这句代码按访问量过滤,计算出访问量大于某个值的地区。
提示:函数groups可以对多个字段分组,汇总字段也可以是多个,select函数也可以进行多条件过滤。
result A5,
这句代码将A5输出到JDBC,以便被JAVA程序调用。
下面在JAVA代码中通过JDBC调用集算器脚本。
//建立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(?)");
//设置参数,假设访问量大于1000000,实际应该是JAVA中的变量。
st.setObject(1,"1000000 ")//
st.execute();//执行esProc存储过程
ResultSet set = st.getResultSet(); //获取结果集
有时候非单行记录文件的字节数较多,无法在内存中一次完成计算,用JAVA处理这类大文件时需要边读边算边写临时文件,代码非常复杂。集算器有游标数据对象,非常适合分段读写大文件。
集算器处理大文件:
先编写主程序main.dfx:
上述代码中,pcursor调用了一个子程序,用来返回实际记录形成的游标。而A2和A3格只需进行分组汇总和过滤即可。需要注意的是,A1的计算结果是游标,而不是内存中的数据,执行函数groups时,游标才会被分批读入内存并进行计算,而这个分批的动作是自动完成的。
子程序sub.dfx负责循环处理文件,每批次读取3*N行,形成N条记录返回,pcursor会依次接收每批次的计算结果,并转化为游标。注意:N不能太大,否则会内存溢出,也不能太小,否则性能较低。具体代码如下:
A1: =file("E:\\Social.txt").cursor()
上述代码中的函数cursor用来打开文件游标,其用法和函数import类似,但函数cursor并不真正把数据读入内存,因此可以支持大文件。
A2-C6:循环处理文件,其中for A1,3*10000表示每次将30000行数据读入内存。读入的数据和从小文件中读取到的一样,因此代码也和之前一样。
相关推荐
首先,研究从非结构化数据的背景和电力系统非结构化数据的特点入手,对电力系统中非结构化数据进行分类和定义。非结构化数据是相对于结构化数据而言,主要来源于各种非电子化的文件,如设计图纸、合同、报告、说明书...
在IT行业中,我们经常需要处理大量的文件,尤其是文本文件,如TXT格式。这些文件可能包含各种数据或信息,有时需要根据特定规则进行批量操作,比如重命名。标题"以TXT文本中非空首行重命名TXT文件V2.0.zip"所指的是...
格罗克图书馆用于从非结构化数据中提取结构化数据的 Java 库该库的灵感来自此处提供的 logstash 拦截器或过滤器 这个 grok 库带有预定义的模式 但是,您也可以创建自己的自定义命名模式。句法模式的语法如下 %{...
面对金融行业中非结构化数据存储的挑战,对象存储成为了一种极具潜力的解决方案。它不仅能够满足海量数据的存储需求,还具有良好的可扩展性和成本效益。随着技术的不断发展和完善,预计对象存储将在金融行业的非结构...
结构化分析方法是面向数据流进行需求分析的方法,采用自顶向下,逐层分解,建立系统的处理流程,以数据流图和数据字典为主要工具,建立系统的逻辑模型。 结构化分析方法的主要步骤包括:通过对用户的调查,以软件的...
非结构化数据是指不符合传统数据库结构的数据,包括文本文件、图片、音频、视频等。这些数据占据了企业中的80%,对企业的关键业务具有重要影响。非结构化数据分析可以帮助企业挖掘隐藏的价值,提高业务效率和决策...
然后,文章详细介绍了DeepLabv3+网络的轻量化结构设计,包括使用MobileNetv2网络替换Xception网络,以提高特征提取效率,并引入注意力模型以提升对图像中非结构化道路可行驶区域的敏感度。 最后,文章总结了融合...
文本预处理是自然语言处理(NLP)领域中的关键步骤,尤其在信息检索、文本分类、情感分析等任务中起到至关重要的作用。本项目聚焦于使用Python进行文本预处理,核心是通过TF-IDF(Term Frequency-Inverse Document ...
非洲城市化_中非合作的新机遇,从城市化视角研究中非合作问题的一篇文章,很不错
通过比较结构化网格和非结构化网格计算结果的差异,可以评估两种网格类型在处理此类问题时的优劣。 为了保证研究结果的可靠性,作者采用了不同的偏心率和半径比进行模拟计算。偏心率ε*和半径比r*是描述偏心圆环管...
- **定义**:非结构化LDPC码是指校验矩阵中非零元素的分布没有固定规律,节点之间的度不相等,且不存在循环或准循环结构子矩阵的LDPC码。 - **优点**:与结构化的LDPC码相比,非结构化LDPC码具有更好的纠错性能。 - ...
工程结构可靠度中非正态分布转为正态分布.pptx
基于特征的参数化CAD系统中非几何特征信息的获取,刘计娟,,在对零件特征分析的基础上,说明非几何特征信息的重要性,并通过Pro/TOOLKIT对参数化特征造型系统Pro/E进行二次开发,完成非几何特征�
AUTONOMY产品定位为企业提供一个统一的平台,用于处理结构化、半结构化和非结构化信息。它广泛适用于统一搜索、电子商务、客户关系管理、知识管理、企业信息门户等多个领域,显著提升了工作效率。由于其自动化、准确...
在"000--Boore的零线校正和滤波处理.zip"压缩包中,可能包含的文件有源代码、说明文档、示例数据等。源代码部分可能使用了Fortran语言,这是一种在科学计算领域广泛应用的编程语言,以其高效和简洁著称。通过阅读和...
【标题】:“可追踪供应链中非确定性RFID数据处理方法” 【摘要】:本文主要探讨了在可追踪供应链应用系统中如何有效处理大量非确定性的RFID数据。通过分析RFID应用的关键特征,研究者提出了一种根据非确定性数据...