结构化文本计算示例(一)
结构化文本是很常见的文件格式,对结构化文本的计算也是很常见的需求。在实现这种计算时,一种很容易想到的办法是将文件导入数据库后再计算,但这会消耗大量时间以及昂贵的数据库资源,而且有的场合下并没有合适的数据库可用。这样一来,我们就会有一个自然的想法,如果能够直接计算就会方便多了。可惜的是,一般高级语言都没有提供针对结构化文本的基本运算类库,而想要通过硬编码完成这些运算又非常繁琐,不仅代码复杂,可维护性还很差。
作为专业的结构化数据计算类库,集算器SPL封装了丰富的结构化计算函数,支持集合运算、关联运算、有序运算,因此可轻松实现结构化文本的运算。此外,SPL还可以通过JDBC调用接口向Java应用提供运算结果(可参考【Java 如何调用 SPL 脚本】),极大地方便集成工作。
下面我们就来看一下常见的结构化文本计算案例,以及SPL对应的解法。
维护
增加记录
在sales.txt的第2行插入1条记录。源文件如下:
OrderID | Client | SellerId | Amount | OrderDate |
26 | TAS | 1 | 2142.4 | 2009-08-05 |
33 | DSGC | 1 | 613.2 | 2009-08-14 |
84 | GC | 1 | 88.5 | 2009-10-16 |
133 | HU | 1 | 1419.8 | 2010-12-12 |
32 | JFS | 3 | 468 | 2009-08-13 |
39 | NR | 3 | 3016 | 2010-08-21 |
43 | KT | 3 | 2169 | 2009-08-27 |
代码
A | |
1 | =file("D:\\sales.txt").import@t() |
2 | =A1.insert(2,200,"MS",20,2000,date("2015-02-02")) |
3 | =file("D:\\sales.txt").export@t(A1) |
结果
OrderID | Client | SellerId | Amount | OrderDate |
26 | TAS | 1 | 2142.4 | 2009-08-05 |
200 | MS | 20 | 2000 | 2015-02-02 |
33 | DSGC | 1 | 613.2 | 2009-08-14 |
84 | GC | 1 | 88.5 | 2009-10-16 |
133 | HU | 1 | 1419.8 | 2010-12-12 |
32 | JFS | 3 | 468 | 2009-08-13 |
39 | NR | 3 | 3016 | 2010-08-21 |
43 | KT | 3 | 2169 | 2009-08-27 |
函数insert插入记录,第1个参数是插入位置,当该参数为0时,表示追加记录。
如果只是向文件追加记录,那么不必读入文件,只需用函数export@a,代码如下:
A | |
1 | =create(OrderID,Client,SellerId,Amount,OrderDate).record([200,"MS",20,2000,date("2015-02-02")]) |
2 | =file("D:\\sales.txt").export@a(A1) |
函数create新建二维表,函数record向二维表追加记录。
另外,可以通过insert@r批量插入记录,代码如下:
A | |
1 | =file("D:\\sales.txt").import@t() |
2 | =create(OrderID,Client,SellerId,Amount,OrderDate) |
3 |
=A2.record([200,"MS",20,2000,date("2015-02-02"), 300,"Ora",30,3000,date("2015-03-03")]) |
4 | =A1.insert@r(2:A2) |
为节省篇幅起见,下文都将省略导出文件的代码。
删除记录
删除sales.txt中的第2条记录。代码如下:
A | |
1 | =file("D:\\sales.txt").import@t() |
2 | =A1.delete(2) |
函数delete支持批量删除,比如删除第2,3,5,6,7条记录:A1.delete([2,3]|to(5,7))
也可以按条件删除,比如删除Amount小于1000的记录:A1.delete(A1.select(Amount<1000))
修改记录
修改sales.txt的第2条记录,将SellerId改为100,Amount改为1000,代码如下:
A | |
1 | =file("D:\\sales.txt").import@t() |
2 | =A1.modify(2,100:SellerId,1000:Amount) |
也可以批量修改,比如将前10条记录的Amount增加10:
A1.modify(1:10,Amount+10:Amount)
增加列
在sales.txt增加列year,填入订单日期OrerDate中的年份。代码:
A | |
1 | =file("D:\\sales.txt").import@t() |
2 | =A1.derive(year(OrderDate):year) |
结果:
删除列
物理上删除列效率较低,通常用“取出保留列”来代替。比如sales.txt中删除Client、SellerId,相当于保留OrderID、Amount、OrderDate,代码如下:
A | |
1 | =file("D:\\sales.txt").import@t() |
2 | =A1.new(OrderID,Amount,OrderDate) |
结果:
修改列
将sales.txt的Amount列增加10%,代码如下:
A | |
1 | =file("D:\\sales.txt").import@t() |
2 | =A1.run(Amount*1.1:Amount) |
结果:
注意函数run跟函数modify的区别:修改整列(所有记录的对应字段)需要用run,只修改指定记录的某列(特定字段)用modify。
基本运算
查询
指定时间段,按参数查询sales.txt。代码:
A | |
1 | =file("D:\\sales.txt").import@t() |
2 | =A1.select(OrderDate>=startDate && OrderDate<=endDate) |
startDate和endDate是输入参数,比如2010-01-01至2010-12-31。结果:
排序
针对sales.txt,按照客户代码(Client)降序排序,按照订单日期(OrderDate)升序排序。
代码:
A | |
1 | =file("D:\\sales.txt").import@t() |
2 | =A1.sort(-Client,OrderDate) |
注意:降序时在字段前面使用英文的减号来表示,即“-”,默认按照升序。
结果:
分组汇总
计算出每个销售员每年的销售额和订单数,即按照销售员分组,对销售额求和,对记录计数。
代码:
A | |
1 | =file("D:\\sales.txt").import@t() |
2 | =A1.groups(SellerId,year(OrderDate);sum(Amount),count(~)) |
函数groups可在分组的同时进行汇总,其中,~表示每组或当前组,count(~)等于count(OrderID)。
结果:
获得唯一值
列出sales.txt中的客户名单,即获取所有Client的唯一值。
代码:
A | |
1 | =file("D:\\sales.txt").import@t() |
2 | =A1.id(Client) |
结果:
去除重复
保留sales.txt中每个客户每个销售员的第一条记录。获取唯一值也是一种去重,这里是另外一种通过分组来去除重复的方式。
代码:
A | |
1 | =file("D:\\sales.txt").import@t() |
2 | =A1.group@1(Client,SellerId) |
通过函数group进行分组(和groups不同,这里可以不汇总),@1表示取每组第1条记录。
结果:
TopN
找到每个销售员销售额最大的3笔订单。
代码:
A | |
1 | =file("D:\\sales.txt").import@t() |
2 | =A1.group(SellerId;~.top(3;-Amount):t).conj(t) |
函数top过滤出TopN,”-”表示逆序,函数conj用于合并结果。
计算结果:
如果只取最大的一笔订单,还可以用maxp函数,不过 maxp直接返回表达式描述的最大记录,因此不用再加符号”-”来描述排序方式。由于分组后的字段t的内容是记录,因此不能用conj(t)来合并,而是需要使用A.(t)方式直接取出t字段。所以取每个销售的最大一笔订单表达式为:=A1.group(SellerId;~.maxp(Amount):t).(t)
结构化文本计算示例(一)相关推荐
- access“idno”字段改为文本型_结构化文本计算示例(一)
结构化文本是很常见的文件格式,对结构化文本的计算也是很常见的需求.在实现这种计算时,一种很容易想到的办法是将文件导入数据库后再计算,但这会消耗大量时间以及昂贵的数据库资源,而且有的场合下并没有合适的数 ...
- 按一行一行的方法将一个文本文件复制到另一个文件中_大文件上的结构化数据计算示例...
[摘要] 本文分析大文件计算的实现原理,如过滤.聚合计算.添加计算列.排序.分组聚合.topN 等,以及利用并行计算来提高计算速度,并用 esProc SPL 举例说明如何用简洁的脚本实现大文件计算. ...
- Rockwell 罗克韦尔AB Logix 5000控制器 结构化文本语言(ST) 梯形图(LD)顺序功能图(SFC)功能块图(FBD) IEC 61131-3 手册
Logix 5000 Controllers IEC 61131-3 Compliance 1756 ControlLogix, 1756 GuardLogix, 1769 CompactLogix, ...
- st计算机编程语言,ST(结构化文本语言(ST))_百度百科
ST (结构化文本语言(ST)) 语音 编辑 锁定 讨论 上传视频 本词条缺少概述图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 结构化文本/结构式文件编程语言(英语:Structured ...
- PLC结构化文本设计模式和算法
前言 . 目前PLC应用学科并没有设计模式方面的教程,导致学员解题都得从零开始设计.梯形图无法发挥出PLC的真正功能,所以我们需要以结构化文本来实现设计模式.本文以普及结构化文本为目的,将教大家结构化 ...
- 文本数据可视化_非结构化文本数据的分析和可视化
文本数据可视化 Stuck behind the paywall? Read this article with my friend link here. 卡在收费墙后面? 在这里与我的朋友链接阅读本 ...
- python文本结构化处理_在Python中标记非结构化文本数据
python文本结构化处理 Labelled data has been a crucial demand for supervised machine learning leading to a n ...
- python绘制基因结构图_Python调用graphviz绘制结构化图形网络示例
安装完成后将安装目录的bin 路径加到系统路径中,有时候需要重启电脑. 然后: pip install graphviz import graphviz as gz 有向图 dot = gz.Digr ...
- MySQL中通过结构化文本倒腾数据
拼接为sql语句 使用mysql dump可以对表或者其它对象dump出来,可以以文本或者sql语句的形式,如果针对一张表的结果集还好说,甚至还可以使用where选项,但如果是多表关联,就不能把整个结 ...
最新文章
- 项目发布: error CS0103: 当前上下文中不存在名称“*****”
- python supper_python supper()函数
- 线程基础知识——Windows核心编程学习手札系列之六
- [BZOJ1130] [POI2008]POD Subdivision of Kingdom
- function 与 + - !~
- 安卓开发 登录用户信息缓存_小程序云开发之用户注册登录
- IE下列表框不能给option绑定click事件的解决办法
- 服务器网口正在验证身份6,无法使用基本身份验证进行身份验证(示例代码)
- 暴力技术(一)——BFS广(宽)度优先搜索
- latex使用记录3
- java的write无法写入,Java加载ImageIO.write的文件在.jar中不起作用
- ORA-01403: no data found
- 微信公号“架构师之路”学习笔记(七)-互联网搜索架构设计
- 前端培训Ajax-onreadystatechange 事件
- Centos7配置软RAID+LVM
- 硬盘出现“文件或目录损坏且无法读取”的故障,怎么解决?
- (42.1)【操作系统漏洞发现专题】操作系统漏洞之简介、分类、危害、发现工具、利用
- 一股清流!唯品会:杜绝不必要的加班!
- MLX90614驱动,功能简介以及PEC校验
- (一)大型电商详情页亿级缓存架构简介
热门文章
- 成语接龙(字符串,思路,按长度排序)
- php多维数组书写方式,php多维数组用法示例
- OpenCV I_07鼠标画笔 setMouseCallback()
- 无线网络ping丢包率测试软件,ping命令图文教程,电脑测试网络丢包延迟,检测网络故障通不通...
- Android中自定义TextView的形状--圆形-椭圆形-圆角矩形-线条
- 2022年,经历了两段实习后,我学会了……
- 权限系统就该这么设计
- 入手域名贵吗?域名注册价格和续费价格是多少钱?
- 【CocosCreator入门】CocosCreator组件 | Mask(遮罩)组件
- 计算机说课比赛题目,小学信息技术《文章标题更醒目》说课稿