Drill Down,常被翻译或解读为深层探究、向下钻取、深入探索、向下切入、…这描述与形容我都觉得很传神,也很有意境。在层层叠叠嵌套式结构化资料的架构中,由广入深的探究底层的资料与有用的讯息,正是资料分析与探勘的必要手段。
清单(List)容器里的元素
正如同先前谈过的清单索引问题,也就是清单里的各个元素都有其索引值,而索引值是由0开启算起,因此,对于以下的清单(List)结构:
mylist = {25,100,"士林",999,"北投"}
若要萃取出此清单的第2个元素,则可以撰写如下的M语言:
secondElement = mylist{1};
记录(Record)容器里的栏位值
至于记录容器(Record)结构的资料,由于在中括号内,是一个个对应的栏位名称与栏位内容,如下所示的範例:
rec =[工号="E9002",姓名="林美如",工时=87,时薪=650]
所以,当您要撷取出此记录里的某一栏位内容就更明确了,只要在记录名称右侧用一对中括号表达栏位名称即可。例如,以下的撰写便可传回工时栏位的内容值:
工时内容 = rec[工时]
资料表(Table)容器里的内容
资料表(Table)是属于栏列交错的资料结构,纵向是资料行,或可称资料栏位;横向则是一笔笔的资料记录。资料表的内容可以是一般的文字、数值、日期、逻辑、…等型态的资料,也可以是清单(List)、记录(Record)、资料表(Table)具备结构化的资料内容。例如:以下的资料表名为「员工资料」:
在Power Query的环境里,若要撷取这一张资料表结构的局部内容,例如:取得第3个资料记录的内容,则M语言的表达方式是:
= 员工资料{2}
因为Power Query物件的索引编号都是从0算起,因此「员工资料{2}」的意思是取出「员工资料」资料表里的第3笔资料记录,而传回的查询结果则是以记录(Record)资料型态呈现。
所以,若要撷取第一笔资料记录,则可输入以下程式码:
= 员工资料{0}
记录里的「基本个资」栏位也是Record资料型态,因此,若要再向下切入撷取此栏位内容,则可以输入以下程式码:
= 员工资料{0}[基本个资]
查询结果显示此栏位里包含了3个资料栏位及内含值,分别为「性别」「男」、「年龄」「38」、「学历」「硕士」。
记录里还有名为「眷属」的栏位,则是属于Table(资料型态)的资料型别,因此,若输入以下程式码:
= 员工资料{0}[眷属]
则传回的查询结果是一张资料表,表示员工资料里的第1笔资料记录(索引编号为0)其眷属资料表。
至于若需要从此资料再向切入,撷取该眷属资料表的第4笔资料记录,则修改一下上述的M语言程式码如下:
= 员工资料{0}[眷属]{3}
后面加上{3}即表示要取出该资料表的第4笔资记录,也就是该名员工的眷属中第4位眷属的资料记录,最终的查询即果为3岁的长女孙莉美。
依此类推,针对此範例的资料内容执行如下的程式码,相信您应该可以很容易解读,可以撷取「员工资料」的第1位员工资料记录其「兴趣」资料栏位的内容,而此内容的查询结果是清单(List)的容器。
= 员工资料{0}[兴趣]
展开容器
例如,透过下述程式码,汇入了讲师劳务报酬资料(三区名册).xml档案:
= Xml.Tables(File.Contents("F:\讲师劳务报酬资料(三区名册).xml"))
由于此XML档案里定义了三张资料表,并嵌套于顶层结构,因此,汇入时有两个资料行,分别命名为Name和Table,共计3笔资料记录,而Table资料行的内容正各区域讲师名册的资料表内容,我们可以透过展开各个资料表的操作来达成彙整资料表的目的。
在展开的功能选单中,取消[使用原始资料行名称做为前置词]核取方块,让展开的资料行名称更为简洁。
资料的展开是透过Table.ExpandTableColumn()函数来完成,此例的M语言程式码为:
= Table.ExpandTableColumn(来源, "Table", {"Name", "Table"}, {"Name.1", "Table.1"})
此函数的第1个参数是原始资料来源;第2个参数使来自原始资料来源里的哪一资料行需要进行展开的作业;第3个参数则是清单(List)结构,描述要展开的资料表里其资料行名称列表;至于第4个参数也是清单(List)结构,描述要展开资料表后的新资料行名称列表。
此例中的原始资料来源原本就有两个资料行:Name及Table,而Table资料行的资料型态是Table容器,展开后,每一个Table容器里的资料表又包含Name及Table两个资料行,因此,展开后的资料会将这两个新资料行,分别命名为 Name.1 和 Table.1,以避免与原始资料表中的资料行名称发生冲突。
在完成展开后,新的Table.1资料行的资料型态也是Table容器,因此,我们可以再度点按其展开按钮,继续向下探勘。
同样的道理,在展开的功能选单中,仍是取消[使用原始资料行名称做为前置词]核取方块,让展开的资料行名称更为简洁。在此刻也可以看到,展开后的资料表将包含了「编号」、「日期」、「讲师」、「性别」、「业务所得」等5个资料行。
完成资料的向下切入后,完整的XML资料解析便呈现在您面前,只需再移除不需要的Name.1资料行,也适度的调整一下各个资料行的资料型态,例如「业务所得」资料行可以设定为整数型态,乃至将「日期」转换成西元日期或其阿日期单位与维度,那就是一份完美的RAW Data了。
经过这一番操作,相信您对于在Power Query环境里,进行查询资料时,对清单(List)、记录(Record)、资料表(Table)等容器的深入探索,应该要如何撰写与编修M语言的程式码一定是了然于胸,得心应手了。在此也结束此一系列的心得分享,后会有期啰!
Power Query三大容器实作系列
- <<Power Query三大容器实作系列 - (1/8) Power Query的资料型态>>
- <<Power Query三大容器实作系列 - (2/8) Power Query的三大容器>>
- <<Power Query三大容器实作系列 - (3/8) Power Query List的建立与编辑>>
- <<Power Query三大容器实作系列 - (4/8) 向下切入:深化(撷取)容器里的内容>>
- <<Power Query三大容器实作系列 - (5/8) – 关于List的索引值>>
- <<Power Query三大容器实作系列 - (6/8) Record(记录)的建立编辑与转换>>
- <<Power Query三大容器实作系列 - (7/8) Table(资料表格)的建立编辑与转换>>
- <<Power Query三大容器实作系列 - (8/8) 细说探索容器里指定内容的M语言>>