PQ实战 | 数据清洗 - 拆分、提取与合并!

刚去论坛给大家找了一个不错的案例,我们使用Power Query来给大家解析一下,算是一个不错的拆分和合并的案例!
需求说明
有三列数据,都是日期开始至结束,现在要找出最小日期和最大日期并拼接!
这个需求是PQ的强项,所以我们直接使用PQ处理!
本文含有代码的练习附件下载见文末!
Power Query详解
加载到PQ编辑器
选中数据区域,点击【数据】-【自表格/区域】,加载到PQ编辑器!

需求简单分析

结果需要添加三列,分别是最小日期、最大日期和使用至拼接后的结果!
一般我们把表格转成行,然后逐行处理,再转成表!
M函数怎么写?
我们想放一下完整的M函数代码截图,方便我们为大家解析
为了方便大家理解,M代码中都使用中文变量(实际开发采用英文或者拼英代替,书写也方便)
处理后:
M函数按逻辑解读


第一步:每一行变成一个Record

一般我们都转成list处理,这里转成记录是为了方便和我们需要的三列结果拼接,代码中的 _& 其中的 _ 就是每一行对应的记录 ,& 表示拼接,记录1 & 记录2 就可以合并成一个大的记录表!
// 按行转成Record
按行转记录 = Table.ToRecords(源)

第二步:遍历每一行,按至拆分,合并后,再提取最小、最大和 拼接


按至拆分 = List.Transform(
    Record.ToList(_) ,(x)=>
         if x is null then {null} else Text.Split(x,"至")
                )
1、我们使用Record.ToList(_)转成列表,方便我们遍历!
2、针对每一行中的每一个元素,如果不是空,都需要使用Text.Split按"至"拆分,形成一个list,空的返回一个{null},方便我们使用List.Combine合并列表,List.Combine要求每一项都是一个list。

第三步:合并拆分后的每个list,并删除null值

List.Combine可以把多个list合并为也给list,但是null是我们不需要的使用合并后,我们使用List.RemoveNulls把其中的null删除!
合并日期list = List.RemoveNulls(List.Combine(按至拆分))

第四步:转成日期格式

转成日期格式 = List.Transform(合并日期list,Date.From)
List.Transform 第二参数要求是函数,如果只有也给参数,我们可以直接写函数名,这里还可以写成 each Date.From(_)
之前我们讲过,PQ中数据是强类型的,不同类型无法比较大小,所以我们转成日期类型,方便我们按日期比较大小!
感官上发现日期格式是倾斜的和我们上面没转换是不同的!

第五步:提取最小、最大及合并

// 从list提取最大、最小日期及合并
需要的三列 = [
  最小日期 = List.Min(转成日期格式),
  最大日期 = List.Max(转成日期格式),
  合并日期 = Text.Format("#{0}至#{1}",{最小日期,最大日期})
]
Min和Max和工作表函数差不多,只是参数需要是list,Text.Format 是非常好用的不同类型数据需要合并的函数,因为强类型的缘故,我们如果想合并不同类型的数据,都要转换类型,使用Text.Format 非常轻松,#{0} 和#{1}是表示第二参数list中的第一项和第二项!类推!

第六步:把原本的行记录和提取的三列组合

我们前面处理的都是为了得到三列值,再 _ & 三列记录 就可以得到最后结果的 记录

第七步:记录转成表,处理完成

// records转表格
结果 = Table.FromRecords(按行处理)
Table.FromRecords 可以把多个记录转成表!
截取部分

第八步:加载到工作表,收工!

本文由“壹伴编辑器”提供技术支持

讲解分了7步,其实我们写的时候只要2分钟就可以搞定!逻辑在心中,函数知道大概,配合#shared可以很快搞定,大家多多练习吧!

附件下载:

链接: https://pan.baidu.com/s/1LkgICWOrPfMtXubWIJJ7FA 提取码: snec 

(0)

相关推荐