Chinaunix首页 | 论坛 | 博客

-

  • 博客访问: 4155539
  • 博文数量: 172
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1923
  • 用 户 组: 普通用户
  • 注册时间: 2018-12-20 14:57
文章分类
文章存档

2021年(19)

2020年(81)

2019年(68)

2018年(4)

我的朋友

分类: 敏捷开发

2020-11-18 10:59:15

在数据处理业务中,有时需要清除文件中的重复数据或只留下重复数据,本文将从小文件、大文件两方面介绍整行去重、关键列去重的几种处理办法,并提供用 esProc SPL 编写的代码示例。esProc 是专业的数据计算引擎,SPL 中有一套完善的集合运算领域的函数库,很适合处理文件去重,写出的代码非常简洁。

 

1.   小文件

1.1  整行去重

有一个文本文件,其每一行是一个字符串,要将文件中的重复行只保留一行。处理此问题可以把文件的每一行读成一个字符串,组成一个集合,然后通过集合去重运算得出结果。

示例:报名绘画兴趣班的同学学号姓名记录在paint.txt中,可能有些同学报了多次,请删除文件中重复的报名后保存在paint1.txt中。原文件部分数据如下所示
    20121102-Joan
    20121107-Jack
    20121113-Mike
    20121107-Jack

esProc SPL脚本如下:


A 注释
1 =file("e:/txt/paint.txt").read@n() 读出paint.txt的每一行组成集合
2 =A1.id() 删除A1集合中重复的成员
3 =file("e:/txt/paint1.txt").write(A2) 将删除重复行后的A2写入文件paint1.txt

 

1.2  关键列比较

一个文件,有多列数据,第一行是列名,第二行开始是数据记录,要对文件中关键列的内容进行比较,对关键列内容重复的行进行删除或只保留重复的行。

现有2018年的销售订单表order_2018.xlsx,部分数据如下所示:

    ..

 

1.2.1.  去除重复

示例1:请求出2018年购买产品的所有不同的客户Id,保存在文件2018c.xlsx中。

esProc SPL脚本如下:


A 注释
1 =file("e:/txt/order_2018.xlsx").xlsimport@t() 读出2018订单表数据
2 =A1.id(CustomerId) 取出所有不重复的客户 Id
3 =file("e:/txt/2018c.xlsx").xlsexport(A2) 将客户Id保存到文件2018c.xlsx

 

示例2:请求出2018年各位客户购买了哪些不同产品,将CustomerIdProductId保存在文件2018c_p.xlsx中。

esProc SPL脚本如下:


A 注释
1 =file("e:/txt/order_2018.xlsx").xlsimport@t(CustomerId,ProductId) 读出2018订单表关键列数据
2 =A1.group@1(CustomerId,ProductId) 按关键列分组,@1表示只取分组中的一条记录
3 =file("e:/txt/2018c_p.xlsx").xlsexport@t(A2) 将结果A2保存到文件2018c_p.xlsx

 

1.2.2.   只保留重复

示例:请求出2018年回头客(即多次购买同种产品的客户)的订单情况,将结果保存在文件2018c_rebuy.xlsx中。

esProc SPL脚本如下:


A 注释
1 =file("e:/txt/order_2018.xlsx").xlsimport@t() 读出2018订单表数据
2 =A1.group(CustomerId,ProductId) 同一客户购买同种产品的订单分为一组
3 =A2.select(~.count()>1).conj() 选出订单数大于1的组,把各组的订单并集为一个数据表
4 =file("e:/txt/2018c_rebuy.xlsx").xlsexport@t(A3) 将结果A3保存到文件2018c_rebuy.xlsx

 

 

2.  大文件

大文件数据不能一次性全部装进内存,不能象小文件数据那样全部读出来再进行重复性比较,需要分批读出数据去比较。esProc SPL提供了游标来处理大文件运算,使大文件去重运算也变得十分方便。

2.1  整行去重

有大文本文件,其每一行是一个字符串,要将文件中的重复行只保留一行。处理此问题要把文件的每一行读成一个字符串,成为游标中的一条记录,然后通过游标的去重运算得出结果。

示例:现有全国房产产权人员登记表大文件all.txt,里面记录产权人的身份证及姓名,部分数据如下所示:
    510121198802213364-Joan
    110113199203259852-Jack
    201264197206271113-Mike

由于有些人员在多个州拥有房产,所以文件中会有重复的登记,请将重复的登记只保留一个,将结果保存在all2.txt中。esProc SPL脚本如下:


A 注释
1 =file("e:/txt/all.txt").cursor@s() 创建游标,@s表示用整行构成单字段串的序表
2 =A1.groupx(_1) 对游标中的单字段分组,就可去掉重复的行
3 =file("e:/txt/all2.txt").export(A2) 将去重后的结果写入文件all2.txt

 

2.2  关键列比对

本节仍用销售订单表为例,是所有年份的合并销售订单表orders.xlsx,是个大文件。

2.2.1.   去除重复

示例1:请找出购买产品的所有不同的客户Id,保存在文件customers.xlsx中。

esProc SPL脚本如下:


A 注释
1 =file("e:/txt/orders.xlsx").xlsimport@tc() 创建订单表数据游标
2 =A1.groupx(CustomerId) CustomerId分组即得到不重复的客户Id
3 =file("e:/txt/customers.xlsx").xlsexport@t(A2) 将客户Id保存到文件customers.xlsx

 

示例2:请找出各位客户购买了哪些不同产品,将CustomerIdProductId保存在文件c_p.xlsx中。

esProc SPL脚本如下:


A 注释
1 =file("e:/txt/orders.xlsx").xlsimport@tc() 创建订单表数据游标
2 =A1.groupx(CustomerId,ProductId) 按关键列分组,即可取得不重复的客户Id和产品Id
3 =file("e:/txt/c_p.xlsx").xlsexport@t(A2) 将结果A2保存到文件c_p.xlsx

 

2.2.2.   只保留重复

示例:请找出回头客(即多次购买同种产品的客户)的订单情况,将结果保存在文件c_rebuy.xlsx中。

esProc SPL脚本如下:


A 注释
1 =file("e:/txt/orders.xlsx").xlsimport@tc().sortx(CustomerId,ProductId) 创建订单表数据游标,并按关键列排序
2 =A1.group(CustomerId,ProductId) 同一客户购买同种产品的订单分为一组
3 =A2.select(~.count()>1).conj() 选出订单数大于1的组,把各组的订单并集为一个数据表
4 =file("e:/txt/c_rebuy.xlsx").xlsexport@t(A3) 将结果A3保存到文件c_rebuy.xlsx

 

 

》中还有更多相关计算示例。

 

 


阅读(1401) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~