Excel 文件结构化解析示例

在数据分析业务中,经常要把Excel文件数据结构化解析以后再进行计算或导入关系数据库,但许多Excel文件的格式并不规整,而且文件结构也多种多样,导致编程进行结构化的工作量会比较大,而且很难通用,每次都要针对文件格式进行分析后再进行开发。

本文将介绍如何进行各种格式的Excel文件结构化解析,如普通行式、复杂表头、自由格式、交叉表、主子表、大文件等,并提供用 esProc SPL 编写的代码示例。esProc 是专业的数据计算引擎,其采用的 SPL 中有完善的 Excel 文件处理函数,进行结构化解析及后续的计算、入库等操作非常方便。

1.  普通行式

这是一种最简单的文件格式,文件中每行都是一条数据记录,更常见的是第一行是列标题。

示例:在学生成绩文件scores.xlsx中,查询各班语文平均成绩。部分数据如下图:

esProc SPL脚本如下:

2.  复杂表头

多数时候,Excel文件的表头格式并不简单,往往是由多行构成的,比如有表标题、项目名称、填表人、填写日期、页码等信息。解析这种格式的文件时,需要跳过复杂的表头,指定从数据行的位置开始读取,然后指定结构化后的数据各列的列名。

示例:在项目造价文件itemPrices.xlsx中,计算项目总造价,部分数据如下图:

esProc SPL脚本如下:

3.  自由格式

一条数据记录分散在多行,字段列值单元格紧跟在列名单元格后面或下面,可能有跨列或跨行的合并单元格。但每条记录所占的行数以及对应行结构是相同的。循环读取时要以每条记录所占行数为单位组成一条记录。

示例:把自由格式的员工信息文件employee.xlsx存入到数据库表employee中,部分数据如下图:

esProc SPL脚本如下:

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脚本如下:

A3格的部分数据如下图所示:

5.  主子表

每个sheet是一条主表记录,同时sheet中也包含N条子表记录。文件中有多少主表记录,就有多少个sheet。对这种主子表结构的数据,需要创建两个数据表分别保存主表和子表的记录。

示例:在员工信息登记表文件staff.xlsx中,每个sheet有员工信息及他的家庭成员信息,请将员工信息及家庭成员信息分别解析成两个结构化数据表。其中一个sheet如下图:

esProc SPL脚本如下:

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读取的员工信息保存到序表A1

B6从第6行开始读取员工家庭成员信息,只读指定的5列Family、Name、Relation、Workplace、Phone

B7将B6序表的Family列改名为IDCard

C7为B7序表的IDCard列赋值为员工信息中的IDCard

B8将B7中的员工家庭成员信息追加到序表A2

A1读到的部分数据如下:

A2读到的部分数据如下:

6.  大文件

大文件结构化解析及计算的相关原理可参看《大文件上的结构化数据计算示例》,那篇文章是以文本文件为例,本文在此以Excel文件为例再作示范。

示例:在订单信息大数据文件orders.xlsx中,统计各地区的订单金额总和。部分数据如下图:


esProc SPL脚本如下:

SPL CookBook》中有更多敏捷计算示例。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容