Power Query三大容器实作系列 - (8/8) 细说探索容器里指定内容的M语言

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语言>>

 

 

关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章

5 点赞(415) 阅读(67)