Excel 文件结构化解析示例

在数据分析业务中,经常要把Excel文件数据结构化解析以后再进行计算或导入关系数据库,但许多Excel文件的格式并不规整,而且文件结构也多种多样,导致编程进行结构化的工作量会比较大,而且很难通用,每次都要针对文件格式进行分析后再进行开发。本文将介绍如何进行各种格式的 Excel 文件结构化解析,如普通行式、复杂表头、自由格式、交叉表、主子表、大文件等,并提供用 esProc SPL 编写的代码示例。esProc 是专业的数据计算引擎,其采用的 SPL 中有完善的 Excel 文件处理函数,进行结构化解析及后续的计算、入库等操作非常方便。1.  普通行式这是一种最简单的文件格式,文件中每行都是一条数据记录,更常见的是第一行是列标题。示例:在学生成绩文件scores.xlsx中,查询各班语文平均成绩。部分数据如下图:

esProc SPL脚本如下:A注释1=file(“e:/excel/scores.xlsx").xlsimport@t()读取文件,@t选项把第一行读作标题2=A1.groups(Class;avg(Chinese):avg_Chinese)按班级分组,计算各班语文平均成绩3=file("e:/excel/class_avg_c.xlsx").xlsexport@t(A2)将计算结果存入新的文件2.  复杂表头多数时候,Excel文件的表头格式并不简单,往往是由多行构成的,比如有表标题、项目名称、填表人、填写日期、页码等信息。解析这种格式的文件时,需要跳过复杂的表头,指定从数据行的位置开始读取,然后指定结构化后的数据各列的列名。示例:在项目造价文件itemPrices.xlsx中,计算项目总造价,部分数据如下图:

esProc SPL脚本如下:A注释1=file(“e:/excel/itemPrices.xlsx").xlsimport(;1,5)  参数“1,5”表示读第一个sheet,从第5行开始读,一直读到sheet结尾2=A1.rename(#1:No,#2:ItemCode,#3:ItemName,#4:Unit,#5:Quantity,#6:Price,#7:Sum)  修改各列的列名3=A2.sum(Sum)计算项目总造价3.  自由格式一条数据记录分散在多行,字段列值单元格紧跟在列名单元格后面或下面,可能有跨列或跨行的合并单元格。但每条记录所占的行数以及对应行结构是相同的。循环读取时要以每条记录所占行数为单位组成一条记录。示例:把自由格式的员工信息文件employee.xlsx存入到数据库表employee中,部分数据如下图:

esProc SPL脚本如下:ABC1=create(ID,Name,Sex,Position,Birthday,Phone,Address,PostCode)2=file(“e:/excel/employe.xlsx").xlsopen()3[C,C,F,C,C,D,C,C][1,2,2,3,4,5,7,8]4for=A3.(~/B3(#)).(eval($[A2.xlscell(]/~/")"))5if len(B4(1))==0break6>A1.record(B4)7>B3=B3.(~+9)8=connect(“db”)9=A8.update(A1,employee)10=A8.close()A1   创建列名为“ID、Name、Sex、Position、Birthday、Phone、Address、PostCode”的空序表A2   打开Excel数据文件A3   定义雇员信息所在单元格列号序列B3   定义雇员信息所在单元格行号序列A4   用for循环读取每个雇员信息B4   A3.(~/B3(#))先算出当前雇员单元格编号序列,再读出这些单元格值组成雇员信息序列。第一次循环时为[C1,C2,F2,C3,C4,D5,C7,C8],第二次循环时为[C10,C11,F11,C12,C13,D14,C16,C17]……每次行号加9。$[A2.xlscell(]与"A2.xlscell("相同,都是表示一个字符串,它的好处是在IDE中编写程序时,如果A2单元格的编号发生了变化,$[A2.xlscell(]中的A2会自动变化,比如在A2前插入了一行,这个表达式就会变成$[A3.xlscell(],而用引号的话,就不会自动变了。B5   判断雇员ID值是否为空,为空则退出循环,结束读数B6   将一条雇员信息存入A1序表尾B7   让雇员信息的行号序列都加上9,读取下一条雇员信息A8-A10   连接数据库,将雇员信息存入数据库表employee,关闭数据库读取出来的A1单元格数据如下图所示:

4.  交叉表交叉表是统计学中常见的一种矩阵式表格,可以清晰地表达两个变量间的数量关系。交叉表数据逐行读入后,需要以某个列变量为基准,另一个变量及交叉值进行行转置;或者以某个行变量为基准,另一个变量及交叉值进行列转置。示例:将订单地区与货运方式交叉表cross.xlsx文件解析成结构化数据,文件数据如下图所示。

esProc SPL脚本如下:A注释1=file(“e:/excel/cross.xlsx").xlsimport@t(;1,2)读入文件第一个sheet,从第2行开始,第2行作列名2=A1.rename(#1:Type)第一列列名改为Type3=A2.pivot@r(Type;Area,Amount)  对A2以Type为基准进行转置,选项@r表示列转行,转换后新的列名分别为Area、AmountA3格的部分数据如下图所示:

5.  主子表每个sheet是一条主表记录,同时sheet中也包含N条子表记录。文件中有多少主表记录,就有多少个sheet。对这种主子表结构的数据,需要创建两个数据表分别保存主表和子表的记录。示例:在员工信息登记表文件staff.xlsx中,每个sheet有员工信息及他的家庭成员信息,请将员工信息及家庭成员信息分别解析成两个结构化数据表。其中一个sheet如下图:

esProc SPL脚本如下:ABC1=create(IDCard,Name,Sex,Birthday,Nation,Phone,Depart,Home,Marital,Entry)2=create(IDCard,Name,Relation,Workplace,Phone)3[B4,B3,D3,F3,H3,F4,H4,B5,F5,H5]4=file(“e:/excel/staff.xlsx").xlsopen()5for   A4=A3.(eval($[A4.xlscell(]/~/",\""/A5.stname/"\")"))  >A1.record(B5)6=A4.xlsimport@t(Family,Name,Relation,Workplace,Phone;A5.stname,6)7=B6.rename(Family:IDCard)  >B7.run(IDCard=B5(1))8>A2.insert@r(0:B7)A1   创建列名分别为IDCard、Name、Sex、Birthday、Nation、Phone、Depart、Home、Marital、Entry的空序表,用于保存主表员工信息A2   创建列名分别为IDCard、Name、Relation、Workplace、Phone的空序表,用于保存子表员工家庭成员信息A3   定义主表员工信息所在单元格序列A4   打开Excel数据文件A5   循环读取Excel文件各sheet数据B5   读取员工信息序列C5   将B5读取的员工信息保存到序表A1B6   从第6行开始读取员工家庭成员信息,只读指定的5列Family、Name、Relation、Workplace、PhoneB7   将B6序表的Family列改名为IDCardC7   为B7序表的IDCard列赋值为员工信息中的IDCardB8   将B7中的员工家庭成员信息追加到序表A2A1读到的部分数据如下:

A2读到的部分数据如下:

6.  大文件大文件结构化解析及计算的相关原理可参看《大文件上的结构化数据计算示例》,那篇文章是以文本文件为例,本文在此以Excel文件为例再作示范。示例:在订单信息大数据文件orders.xlsx中,统计各地区的订单金额总和。部分数据如下图:

esProc SPL脚本如下:A注释1=file(“e:/excel/orders.xlsx").xlsimport@tc()读文件,@t表示第一行是列名,@c表示返回游标2=A1.groups(Area;sum(Amount))按地区分组,统计各地区订单总金额《SPL CookBook》中有更多敏捷计算示例。

(0)

相关推荐

  • Python对excel的基本操作

    目录 1. 前言 2. 实验环境 3. 基本操作 3.3.1 获取工作表 3.3.2 遍历工作表 3.3.3 获取单元格数据 3.3.4 遍历行 3.3.5 遍历列 指定行 指定行范围 方法iter_ ...

  • Java 设置Excel条件格式(高亮条件值、应用单元格值/公式/数据条等类型)

    概述 在Excel中,应用条件格式功能可以在很大程度上改进表格的设计和可读性,用户可以指定单个或者多个单元格区域应用一种或者多种条件格式.本篇文章,将通过Java程序示例介绍条件格式的设置方法,设置条 ...

  • excel筛选怎么用-excel表格基础教程示例

    筛选,在excel日常办公中,是一个常用的功能,利用筛选可以方便的查找许多数据,筛选的使用也很简单,一般情况下,以首行为筛选项目的居多,而且在默认情况下点筛选也会在首行出现一个小倒三角,但是您看下图我 ...

  • VBA专题10-25:使用VBA操控Excel界面之一个示例程序

    excelperfect 在前面的一系列主题中,你已经学到了很多小的修改工作簿外观的VBA代码.下面,我们将介绍一个简单的示例程序,实现下面的功能特点: 1. 当打开工作簿时, 1.1 激活特定的工作 ...

  • EXCEL经典公式解析-中式排名!

    今天我们来说点谈一下排名的问题,把经典的中式排名公式剖析一下. 我们先来看一下中式排名和美式排名的区别: 简单来说,就是美式相同的排名会占位,比如这里的美式没有第三名, 直接第四名,也就是说,他没有真 ...

  • 649 膜蒸馏再生除湿溶液型低能耗干燥装置软件化设计示例(1)

    背景 以衣物干燥为例,设干燥室内湿衣物3.0kg,衣物中需干燥除去水分1.5kg.衣物当量面积6.0m2,干燥过程衣物温度不超过40℃,干燥时间不超过120分钟. 装置流程 膜蒸馏再生除湿溶液型热敏物 ...

  • 650 膜蒸馏再生除湿溶液型低能耗干燥装置软件化设计示例(2)

    装置流程 装置流程如下图(王珍绘制). 膜组件A设计 参考第580篇软件(V4版本),膜蒸馏组件A设计方案如下. 膜组件A采用壳管式结构,其中的疏水微孔膜管材料为聚丙烯,膜管内直径1.0mm,外直径1 ...

  • 常识化解析哲学的本体论缺陷

    在康德之后,西方哲学界因为缺乏建构终极本体论的途径,所以再也没人不谈世界的本体具体是什么了,所以只会卖弄认识论和方法论的高明的哲学被判定已死,还真不是空穴来风,因为缺乏终极本体论指导的哲学当然与无源之 ...

  • 必须掌握的15个Excel表格操作技巧示例

    在职场办公中,Excel的使用率还是非常高的,但能正确使用Excel系统的并不是很多,今天,小编给大家准备了一些Excel表格的基本技巧,希望对大家的工作有所帮助. 一.单元格内强制换行 二.锁定标题 ...

  • 早读 | 如何实现半月板中心化?这份超清GIF图注解析别错过!

    前段时间,很多国内的朋友听了我的课或者是看了网上我的讲课视频后跟我探讨半月板中心化的问题,半月板中心化的确是近几年来比较新的话题,可供参考的资料并不是很多,争论又很多,我们开展这方面的工作有了一段时间 ...

  • 图库秒变私人影像馆,杂志化布局尽显图片之美丨EMUI 11亮点功能全解析

    移动互联网时代,我们越来越习惯手机拍照记录生活,定格美好瞬间. 然而,你是否也有这样的小烦恼--打开图库密密麻麻的相册平铺直现,封面照片系统随机抓取,总显得美中不足:想要制作一个长拼图或者Vlog,有 ...