【摘要】

本文介绍将多个文本文件和 Excel 文件合并成一个文件,或者将一个文件拆分成几个小文件时,如何处理会遇到的几种情况,并用 esProc SPL 举例实现。

在数据处理业务中,经常要把文件结构相同或近似相同的数据文件合并成一个文件,或者将一个比较大的数据文件拆分成小的数据文件。本文将介绍文本文件和 Excel 文件合并及拆分会遇到的几种情况,并提供用 esProc SPL 编写的代码示例。esProc 是专业的数据计算引擎,SPL 中有完善的文件导入、导出及目录操作函数,非常适合做数据文件的合并及拆分工作。

一、 文件合并

1. 同构文本文件合并

在某个文件目录下有多个文本文件,这些文件表头和列结构完全相同,只是数据行数和数据内容不同,需要将这些文件的数据全部合并到一个文本文件中,共用同一个表头。

示例:在e:/orders目录下有每日的订单文本文件,每个文件的结构相同,第一行是列名,第二行开始是数据,如下图所示,请将它们合并成一个订单表文件orders.txt。

esProc SPL脚本如下:

A 注释

如果e:/orders还有子目录,子目录中的txt文件也需要一起合并,那么把A1格改成=directory@ps("e:/orders/*.txt"),选项@s表示递归查找所有子目录下的文件。

上面这段脚本是假设内存能够装下合并以后的全部数据,如果装不下,那么应该用下面这段脚本:

A B C

A1 列出目录中的所有txt文件的完整路径名称,如果要查找子目录,则加上@s选项

A2 对列出的文件进行循环

B2 用游标读取每一个文件,@t表示第一行是列名

B3-C4 将B2游标中数据导出,第一次要导出列名,其后用@a进行追加

2. 结构近似的文本文件合并

如果文件结构并不是完全相同,比如列的顺序不一样、列数不一样,但各文件都含有共同的几列,想要把这些共同列的数据都合并到一个文件中。合并这些文件时,需要按指定顺序读出每个文件中的这些共同列数据。

示例:还是上面这个例子,已知所有订单文件都有ID、Company、Area、OrderDate、Amount这5列,但各文件中列的顺序并不相同,有的文件还有其它一些列,请将各文件中的这5列数据合并到orders.txt文件中。

esProc SPL脚本如下:

A 注释

同样地,如果内存装不下合并后的所有数据,则使用下面这段脚本:

A B C

3. 文件名转成列数据

在合并数据的同时,需要为合并后的数据增加一列,并用合并前的文件名给此列赋值,以便标记数据类别或来源。

示例:在e:/orders目录下有各种零件的订单Excel文件,文件名就是零件的名字,比如tyre.xlsx、engine.xlsx……等,每个文件的结构相同,第一行是列名,第二行开始是数据,如下图所示,请将它们合并成一个订单表文件orders.xlsx,并增加一列PartName用来记录零件的名字。

esProc SPL脚本如下:

A 注释

同样地,如果内存装不下合并后的所有数据,则使用下面这段脚本:

A B C

合并后的orders.xlsx文件部分数据如下图所示:

二、 文件拆分

1. 分组拆分

对文件中数据进行分组,把每组数据单独存为一个文件,用组名为文件命名。

示例:在订单表Excel文件中有各种零件的订单,请把同种零件的订单各存为一个Excel文件,以便发送给零件生产部门。

esProc SPL脚本如下:

A1 读入所有原始数据

B1 按partName分组

A2 循环每个零件组的订单信息

B2 以零件名称作为文件名,导出零件信息

如果原文件很大,不能全部装入内存,那么应该使用游标方式读数,脚本如下:

A1 创建游标读取原始数据

A2 循环游标读数,每次读50000行(读多少行根据内存大小决定)

B2 对每次读取的数据按partName分组

B3 循环每组零件

C3 以零件名称作为文件名创建文件对象

C4-D5 如果文件已存在,则用@a追加写入零件订单信息,不存在则用@t先写入列名再导入数据

2. 记录占据多行的拆分

在文本文件中,一条数据记录是由多行数据组成的,在拆分成小文件时,要识别哪几行是同一条数据记录,保证同一条数据记录不会被拆分到两个文件中。

示例1:有网站运行日志文件log.txt,每条日志由5行组成,现在需要把这个日志文件拆分成一些小文件,每个文件由1000条日志组成。

esProc SPL脚本如下:

A1 用游标读取日志文件数据,@s表示将整行读成一个字符串

A2 循环游标,每次取5000行,刚好是1000条日志

B2 按循环序号生成日志文件名,如log_1.txt、log_2.txt……,然后将当前取出的所有行写入

示例2:有程序运行日志文件log.txt如下图所示,每条日志由不确定的几行组成,每条日志由中括号开头,其后只要不是中括号开头的行,都与它属于同一条日志。现在需要把这个日志文件拆分成一些小文件,每个文件由1000条日志组成。

esProc SPL脚本如下:

A1 打开日志文件读取数据,@n表示将每一行读成一个字符串,所有串组成一个序列返回

B1 筛选出非空的行

A2 按行是否用中括号开头作为分组条件,中括号开头的作为一个新组,不是则并到当前组。最后把所有组序列转换成游标

A3 循环游标,每次取1000个组,即1000条日志

B3 按循环序号生成日志文件名,如log_1.txt、log_2.txt……

B4 两层循环,外层是循环1000个组,内层循环每组的成员(即数据行),将每行追加写入文件

《SPL CookBook》中有更多相关计算示例。

mysql多行合并成一行_数据文件合并与拆分相关推荐

  1. 怎么把好几行弄成一行_怎么把excel表格里多行变成一行数据|excel表格中让多行内容变成为一行...

    excel怎么把多行数据变成一行 F1=INDEX($A$1:$E$21,ROUNDUP(COLUMN()/5,0),COLUMN()-5*(ROUNDUP(COLUMN()/5,0)-1))向后拉 ...

  2. 怎么把好几行弄成一行_将多行内容合并成一行的两种方式

    在利用Unix操作系统在实现一些具体应用的时候,可能需要把某些显示的结果进行行与行之间的合并.如现在需要用Unix操作系统设计一个彩票软件,每一张彩票上最多可以打印五注内容.在Unix操作系统的数据文 ...

  3. 怎么把好几行弄成一行_【excle 如何多行变一行】excel中怎么把多行同一个人的数据变成一行?...

    excel中怎样实现多行数据变成一行数据 最简单的方法就是讲姓名2制(即成员)后在"本人"所,家庭成员1所在列做"选择性粘贴",然后选择"行列互换&q ...

  4. 同一列两行数据怎么合并成一行_经常加班怎么办?两分钟学会这4招,让同事刮目相看!...

    刚放完小长假回来,面对满屏幕铺天盖地的表格,我只能痛苦地哀号--「救命啊!新年第一次加班就要开始了!」 真的是工作量大吗?不!是我被下面这些问题都纠缠了三四个小时了-- 公式一直在报错? 算不出正确结 ...

  5. 怎么把好几行弄成一行_我在git merge的时候遇到了冲突,怎么解决?

    大家好,今天来和大家聊一个老生常谈的问题,我们在使用git merge的时候遇到了冲突,怎么办? 首先我们来看看为什么会冲突,git冲突的原因很简单,就是两个分支当中对同一处代码进行了不同的改动.于是 ...

  6. mysql大量数据合并_mysql中将多行数据合并成一行数据

    一个字段可能对应多条数据,用mysql实现将多行数据合并成一行数据 例如:一个活动id(activeId)对应多个模块名(modelName),按照一般的sql语句: 1 SELECT am.acti ...

  7. mysql把相同id的多行合并到一行_mysql中将多行数据合并成一行数据

    一个字段可能对应多条数据,用mysql实现将多行数据合并成一行数据 例如:一个活动id(activeId)对应多个模块名(modelName),按照一般的sql语句: 1 SELECT am.acti ...

  8. java 合并到一行_mysql中将多行数据合并成一行数据

    一个字段可能对应多条数据,用mysql实现将多行数据合并成一行数据 例如:一个活动id(activeId)对应多个模块名(modelName),按照一般的sql语句: 1 SELECT am.acti ...

  9. sqlserver函数多行数据合并成一行

    sqlserver函数多行数据合并成一行 SELECTusername,coursename= (STUFF((SELECT ',' + coursenameFROM t_user_courseWHE ...

最新文章

  1. 面试准备--7.31
  2. 机器学习-第六章 支持向量机(SVM)
  3. 五步就让你成为一名很出色的程序员!
  4. iOS底层(三)-状态寄存器
  5. ubuntu c mysql_Ubuntu下MySql和C连接的一些问题
  6. Python趣味编程---Python也会讲笑话
  7. P1600 天天爱跑步
  8. Ext 3.0 +ASP.NET2.0 可视化开发介绍
  9. 动态规划经典题:给出两个字符串s1和s2,返回其中最大的公共子串
  10. aws rds监控慢sql_AWS RDS SQL Server –监视数据库实例
  11. HDU 1024 (不重叠m段最大和) Max Sum Plus Plus
  12. 计算机代码大全喜欢你,2020微信表白代码大全
  13. 电脑IE打开慢的主要原因
  14. QA:filter-自适应均衡器
  15. Hadoop Dynamometer工具详细教程,填坑日记
  16. Plant Com:定量检测宿主微生物组的HA-QAP技术
  17. 【新手向】Python做一个简易登录注册GUI界面(无事件绑定)
  18. Arduino的详细介绍(基于Mega2560)
  19. attention机制及self-attention(transformer)
  20. 实例:建立一个触发器,当scott.emp被删除一条记录时,把被删除记录写到删除日志里面去

热门文章

  1. linux的centos版本修改时间重启后无效的问题
  2. 数据增强之图像旋转及坐标对应(附代码)
  3. kmemleak的使用---内存泄露检测工具【转】
  4. Android下 scrollview的滚动停止事件的监听方法
  5. 学习WINDOWS内核好书
  6. 为什么需要IP地址?—Vecloud微云
  7. JS创建对象学习笔记
  8. workerman介绍
  9. py+selenium 报错NameError: name 'NoSuchElementException' is not defined【已解决】
  10. 对不队——Alpha冲刺