文本文件比对示例

在数据处理业务中,有时需要比较两个文本文件内容有哪些相同或不同的数据,本文将介绍文本文件比对的几种情况,如整行比对、关键列比对,同时又分小文件、大文件比对,并提供用 esProc SPL 编写的代码示例。esProc 是专业的数据计算引擎,SPL 中有一套完善的集合运算领域的函数库,做文件比对很方便,写出的代码非常简洁。1.   小文件比对1.1  整行比对有两个文本文件,其每一行是一个字符串,要对这两个文件中整行内容进行比对。处理此问题可以把文件的每一行读成一个字符串,组成一个集合,然后通过两个集合的运算得出结果。报名绘画、舞蹈兴趣班的同学学号姓名分别记录在paint.txt和dance.txt中,paint.txt部分数据如下所示:20121102-Joan20121107-Jack20121113-Mike1.1.1.   找相同把两个文件中整行内容相同的行都找出来,即求两集合的交集。示例:请找出报了这两个兴趣班的所有同学,记录在p_d.txt文件中。esProc SPL脚本如下:A注释1=file("e:/txt/paint.txt").read@n()读出paint.txt的每一行组成集合2=file("e:/txt/dance.txt").read@n()读出dance.txt的每一行组成集合3=file("e:/txt/p_d.txt").write(A1^A2)将A1、A2集合的交集写入文件p_d.txt中1.1.2.  找不同找不同有以下两种情况:1、  找出两个文件中所有不相同的行。示例:找出所有只报了一个兴趣班的同学, esProc SPL脚本如下:A注释1=file("e:/txt/paint.txt").read@n()读出paint.txt的每一行组成集合2=file("e:/txt/dance.txt").read@n()读出dance.txt的每一行组成集合3=file("e:/txt/p_d.txt").write(A1%A2)将A1、A2集合的异或集写入文件p_d.txt中2、找出一个文件中有而另一个文件中没有的行。示例:找出只报了绘画班的同学和只报了舞蹈班的同学, esProc SPL脚本如下:A注释1=file("e:/txt/paint.txt").read@n()读出paint.txt的每一行组成集合2=file("e:/txt/dance.txt").read@n()读出dance.txt的每一行组成集合3=file("e:/txt/p_1.txt").write(A1\A2)将绘画班A1减去舞蹈班A2所得的差集,即只报了绘画班的同学,写入文件p_1.txt中4=file("e:/txt/d_1.txt").write(A2\A1)将舞蹈班A2减去绘画班A1所得的差集,即只报了舞蹈班的同学,写入文件d_1.txt中1.2  关键列比对两个文本文件,有多列数据,第一行是列名,第二行开始是数据记录,要对两个文件中关键列的内容进行比对。处理此问题可以把文件读成数据集,取出关键列的记录值组成一个集合,然后通过两个集合的运算得出结果。有2018、2019年的销售订单表order_2018.txt和order_2019.txt,两文件有相同的列结构,部分数据如下所示:

1.2.1.   找相同把两个文件中关键列值相同的都找出来。示例:请找出这两年都购买了同一种产品的用户CustomerId和产品ProductId,记录在c_p.txt文件中。esProc SPL脚本如下:A注释1=file("e:/txt/order_2018.txt").import@t(CustomerId,ProductId)读出2018订单表中的关键列数据2=file("e:/txt/order_2019.txt").import@t(CustomerId,ProductId)读出2019订单表中的关键列数据3=[A1,A2].merge@io()对两年数据进行归并,@i表示返回共同包含的记录4=file("e:/txt/c_p.txt").export@t(A3)将A3中的结果写入c_p.txt中c_p.txt文件中部分数据如下:CustomerId     ProductId20108     120806     31.2.2.  找不同示例1:找出2019年新增客户的订单情况,保存在文件new_c.txt中, esProc SPL脚本如下:A注释1=file("e:/txt/order_2018.txt").import@t()读出2018年的订单表2=file("e:/txt/order_2019.txt").import@t()读出2019年的订单表3=A2.id(CustomerId)\A1.id(CustomerId)用2019年所有客户Id减去2018年的,得到新增的客户Id4=A2.select(A3.contain(CustomerId))从2019年订单表筛选出新增客户的订单5=file("e:/txt/new_c.txt").export@t(A4)将新增客户订单写入文件new_c.txt中new_c.txt中部分数据如下:

示例2:找出2019年所有流失的客户Id,保存在文件lost_c.txt中, esProc SPL脚本如下:A注释1=file("e:/txt/order_2018.txt").import@t()读出2018年的订单表2=file("e:/txt/order_2019.txt").import@t()读出2019年的订单表3=A1.id(CustomerId)\A2.id(CustomerId)用2018年所有客户Id减去2019年的,得到流失的客户Id4=file("e:/txt/lost_c.txt").write(A3)将流失客户Id写入文件lost_c.txt中2.  大文件比对大文件数据不能一次性全部装进内存,不能象小文件数据那样全部读出来再进行比对,需要分批读出数据去比较。esProc SPL提供了游标来处理大文件运算,使大文件比对运算也变得十分方便。2.1  整行比对有两个大文本文件,其每一行是一个字符串,要对这两个文件中整行内容进行比对。处理此问题要把文件的每一行读成一个字符串,成为游标中的一条记录,然后通过两个游标的运算得出结果。现有各州房产产权人员登记表大文件,里面记录产权人的身份证及姓名,部分数据如下所示:510121198802213364-Joan110113199203259852-Jack201264197206271113-Mike2.1.1.   找相同把两个文件中整行内容相同的行都找出来,即求两文件的交集。示例:请找出在Washington和New York两个州都有房产的人员,记录在w_n.txt文件中。esProc SPL脚本如下:A注释1=file("e:/txt/washington.txt").cursor@s().sortx(_1)创建Washington数据游标,并排序2=file("e:/txt/newyork.txt").cursor@s().sortx(_1)创建New York的数据游标,并排序3=[A1,A2].mergex@i()对两游标数据进行有序归并,@i表示算出共同包含的数据,即在两州都有房产的人员4=file("e:/txt/w_n.txt").export(A3)将算出的结果写入文件w_n.txt中【注】:若文件中的数据是排好序的,则不再调用sortx函数,以下同2.1.2.  找不同示例:现有全国房产产权人员总表all.txt和Washington房产产权人员登记表,请检查总表中是否有遗漏的Washington人员,结果记录在lost_w.txt中。esProc SPL脚本如下:A注释1=file("e:/txt/washington.txt").cursor@s().sortx(_1)创建Washington数据游标,并排序2=file("e:/txt/all.txt").cursor@s().sortx(_1)创建全国的数据游标,并排序3=[A1,A2].mergex@d()对两游标数据进行有序归并,@d表示从A1中去掉A2中的所有人员,即总表中遗漏的Washington人员4=file("e:/txt/lost_w.txt").export(A3)将算出的结果写入文件lost_w.txt中2.2  关键列比对与小文件比对不同,大文件进行关键列比对时要用游标来操作,先按关键列排序,再对两个游标数据进行有序归并计算出需要的结果。本节仍用小文件比对时的2018、2019年的销售订单表order_2018.txt和order_2019.txt,只是数据量大大增加到大文件的规模。2.2.1.  找相同把两个文件中关键列值相同的都找出来。示例:请找出这两年都购买了同一种产品的用户CustomerId和产品ProductId,记录在c_p.txt文件中。esProc SPL脚本如下:A注释1=file("e:/txt/order_2018.txt").cursor@t(CustomerId,ProductId)创建2018订单表关键列数据游标2=file("e:/txt/order_2019.txt").cursor@t(CustomerId,ProductId)创建2019订单表关键列数据游标3=A1.sortx(CustomerId,ProductId)对2018数据按关键列排序4=A2.sortx(CustomerId,ProductId)对2019数据按关键列排序5=[A3,A4].merge@i()对两年数据进行归并,@i表示返回共同包含的记录6=file("e:/txt/c_p.txt").export@t(A5)将A5中的结果写入c_p.txt中2.2.2.  找不同示例1:找出2019年新增客户的订单情况,保存在文件new_c.txt中, esProc SPL脚本如下:A注释1=file("e:/txt/order_2018.txt").cursor@t()创建2018年订单表游标2=file("e:/txt/order_2019.txt").cursor@t()创建2019年订单表游标3=A1.groupx(CustomerId)按CustomerId分组取得2018客户Id4=A2.groupx(CustomerId)按CustomerId分组取得2019客户Id5=[A4,A3].mergex@d()2019减去2018,得到新增客户Id6=A2.reset().sortx(CustomerId)2019游标复位后按CustomerId排序7=joinx(A6:new_order,CustomerId;A5:new_c,CustomerId)2019年订单表与新增客户Id连接,筛选出新增客户的订单8=file("e:/txt/new_c.txt").export@t(A7.(new_order))将新增客户订单写入文件new_c.txt中注:groupx的结果已经按分组字段CustomerId排序。示例2:找出2019年所有流失的客户Id,保存在文件lost_c.txt中, esProc SPL脚本如下:A注释1=file("e:/txt/order_2018.txt").cursor@t()创建2018年订单表游标2=file("e:/txt/order_2019.txt").cursor@t()创建2019年订单表游标3=A1.groupx(CustomerId)按CustomerId分组取得2018客户Id4=A2.groupx(CustomerId)按CustomerId分组取得2019客户Id5=[A3,A4].mergex@d()2018减去2019,得到流失客户Id6=file("e:/txt/lost_c.txt").export@t(A5)将流失客户Id写入文件lost_c.txt中3.  大文件与小文件比对大文件与小文件对比时,可以把小文件数据全部读进内存,大文件用游标处理,与小文件的数据进行连接计算。3.1  整行比对还用上小节的例子,大文件是各州房产产权人员登记表,小文件是某城市房产产权人员登记表。3.1.1.  找相同把两个文件中整行内容相同的行都找出来,即求两文件的交集。示例:请找出在Washington州和New York城都有房产的人员,记录在w_n.txt文件中。esProc SPL脚本如下:A注释1=file("e:/txt/washington.txt").cursor@s()创建Washington数据游标,无需排序2=file("e:/txt/newyorkcity.txt").read@n()读出New York城的数据,@n表示读出整行构成序列3=A1.join@i(_1,A2)将A1游标数据与A2连接,@i表示只保留A2中有的数据4=file("e:/txt/w_n.txt").export(A3)将算出的结果写入文件w_n.txt中3.1.2.  找不同示例:请检查New York州登记表中是否有遗漏的New York城的人员,结果记录在lost_w.txt中。esProc SPL脚本如下:A注释1=file("e:/txt/newyork.txt").cursor@s()创建Washington数据游标,无需排序2=file("e:/txt/newyorkcity.txt").read@n()读出New York城的数据,@n表示读出整行构成序列3=A1.join@i(_1,A2)将A1游标数据与A2连接,@i表示只保留A2中有的数据4=A2\A3.(_1)从A2中减去共有的数据行,得到遗漏的数据行5=file("e:/txt/lost_w.txt").export(A4)将算出的结果写入文件lost_w.txt中3.2  关键列比对本节使用2019年的销售订单表order_2019.txt和2019年之前所有年份的订单表order_old.txt,前者是小文件,后者是大文件。3.2.1.  找相同示例:请找出2019年及之前某年都购买了同一种产品的用户CustomerId和产品ProductId,记录在c_p.txt文件中。esProc SPL脚本如下:A注释1=file("e:/txt/order_old.txt").cursor@t(CustomerId,ProductId)创建2019之前订单表关键列数据游标2=file("e:/txt/order_2019.txt").import@t(CustomerId,ProductId)读出2019订单表关键列数据3=A2.group@1(CustomerId,ProductId)对2019数据删除重复记录4=A1.join@i(CustomerId:ProductId,A3:CustomerId:ProductId)将A1游标与A3按关键列连接,@i表示只保留能找到的记录5=A4.fetch().group@1(CustomerId,ProductId)取出连接后的结果并删除重复记录6=file("e:/txt/c_p.txt").export@t(A5)将A5中的结果写入c_p.txt中3.2.2.  找不同示例1:找出2019年新增客户的订单情况,保存在文件new_c.txt中, esProc SPL脚本如下:A注释1=file("e:/txt/order_old.txt").cursor@t()创建2019之前订单表数据游标2=file("e:/txt/order_2019.txt").import@t()读出2019订单表数据3=A1.groupx(CustomerId)按CustomerId分组取得2019之前客户Id4=A2.id(CustomerId)取得2019年所有不重复的客户Id5=A3.join@i(CustomerId,A4).fetch()A3与A4连接,@i表示保留A4中包含的客户Id6=A4\A5.(CustomerId)2019年客户Id减去A5中的,得到新增的7=A2.select(A6.contain(CustomerId))筛选出2019新增客户的订单8=file("e:/txt/new_c.txt").export@t(A7)将新增客户订单写入文件new_c.txt中示例2:找出2019年所有流失的客户Id,保存在文件lost_c.txt中, esProc SPL脚本如下:A注释1=file("e:/txt/order_old.txt").cursor@t(CustomerId)创建2019之前订单表中客户Id游标2=file("e:/txt/order_2019.txt").import@t(CustomerId)读出2019订单表客户Id数据3=A2.id(CustomerId)取得2019中不重复的客户Id4=A1.select(!A3.contain(CustomerId))从2019之前的客户中筛选出不在2019年的5=A4.groupx(CustomerId)Id删除重复的客户6=file("e:/txt/lost_c.txt").export@t(A5)将流失客户订单写入文件lost_c.txt中《SPL CookBook》,中有更多相关计算示例。

(0)

相关推荐

  • PHP中的文件系统函数(三)

    PHP中的文件系统函数(三) 总算来到我们最关心的部分了,也就是 f 相关函数的操作.基本上大部分的文件操作都是以今天学习的这些内容为基础的,话不多说,我们就一个一个的来学习学习吧. 文件读取 文件的 ...

  • PHP的SPL扩展库(五)文件及设计模式

    PHP的SPL扩展库(五)文件及设计模式 对于 SPL 来说,除了我们之前学习到的各种 数据结构 以及 迭代器 之外,还有一类非常好用的功能就是对于文件的操作.今天我们就来学习这方面的内容,同时,这也 ...

  • 搜罗全网!ArcGIS二次开发Python(arcpy)指南(五):你不知道的属性表游标本质和应用

    前言:ArcPy 通过游标对象获取.处理矢量数据的属性信息.但游标对象不仅仅局限于 ArcPy,它也是 Python 体系下的,可以是 Pythonic 的,这一节,由浅到深带你了解游标的用法,最后回 ...

  • infercnv输入文件的制作

    有粉丝反映跟着我们的教程:使用inferCNV分析单细胞转录组中拷贝数变异 ,但是第一步3个输入文件就制作失败,值得单独写教程强调一下这个解决方案.当然了,如果你还卡在第一步安装R包,请看我昨天在生信 ...

  • 学霸的考场作文实战示例:高考作文如何开头与结尾

    俗谚:编筐编篓,重在收口.写文章,常常是头难起,尾难收. 评卷时,开头结尾也往往是评卷人的聚焦点,基础等级和发展等级的许多点都可以从开头结尾看出来. 关于开头结尾的要求,古人有形象而精辟的说法,曰&q ...

  • 人力资源金字塔示例(30个)

    金字塔模型是由美国匹兹堡大学商学院John E·Prescott教授提出的,主要用于对竞争对手的跟踪分析,是企业开展竞争对手跟踪工作的指导工具,Prescott的金字塔模型提供了一条"竞争信 ...

  • 间接报酬的11个示例?

    每个人都为薪水而工作,那是直接物质回报,薪酬的另一方面对员工也很重要,就是间接薪酬.直接回报和间接回报有什么区别,间接回报的例子有哪些? 1.什么是间接回报? 你用来阅读文章的智能手机-谁付费?如果你 ...

  • SINAMICS V90 PN 伺服系统的配置示例

    FSB 用于单相电网的连接图: FSD 用于三相电网的连接图: ⚠警告接线错误导致人身伤害和设备损坏 错误的接线会导致较高的电击和短路风险,从而会对人员安全和设备造成危害. · 驱动与电机必须直接连接 ...

  • 增肌应该吃什么?70公斤男士增肌食谱示例

    增肌应该吃什么? 先计算你每天消耗的热量 基础代谢率(BMR): 女=655+(9.6x体重kg)+(1.8x身高cm)-(4.7x年龄years)(单位:大卡) 男=66+(13.7x体重kg)+( ...

  • 建筑工程常用的四类防水材料:总结示例,认识一下!

    建筑工程常用的四类防水材料:总结示例,认识一下!

  • 施工现场“九牌一图”完整示例

    (本文为通用版本,本地主管部门有要求时,需按本地主管部门要求设置) 一.安全宣传牌 二.施工人员概况牌 项目经理: 项目副经理:技术负责人: 安全负责人:材料负责人: 核算负责人:资料负责人: 试验负 ...

  • 机电预留预埋如何保证施工质量?典范示例!

    来源:建筑工程鲁班联盟 如有侵权,请联系删除 预留预埋是机电安装工程前期最为关键的工作,施工质量做不好的话,后期处理往往要牵扯土建与装饰等多专业,造成很大麻烦,因此要格外重视施工质量,以保不出错漏.本 ...