【声明】这两个方法均来自于QQ群453524740。原创者为上海-SEM-施阳。转载到此也是为了记录和保存,避免淹没在QQ聊天记录中而流失。
一、需求
如表1所示,数据列同时包含了属性和值,现在需要将其整理成表2的形式。
二、方法一:利用辅助list,构造Record
let
源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
list = {"A".."J"},
分组 = Table.Group(源, {"日期"}, {{"List", each Record.FromList([数据],list), type record}}),
展开 = Table.ExpandRecordColumn(分组, "List", list, list)
in
展开
注意“each Record.FromList([数据],list)”部分,施阳大神给的代码中,[数据]前面有个短下划线_,但我自己试验,发现这个短横线多余,去掉也并不影响结果。原因在于 Record.FromList()函数的语法为:
Record.FromList(list as list, fields as any) as record
但为何加上这个短横线代码也不出错,我就不得而知了。也许在 Record.FromList()函数中,两个参数的含义本身就是将list的每一个元素和fields的每一个元素分别配对组成records列表。
此外,单独构造的{A..J}的来源是每天的记录有多少列,这个需要手工去统计,或者用别的办法得到每天的记录的列数。我尝试给出了一种不需手工统计来构造这个list的方法(代码很笨拙,原因在于我不会用List.Generate()函数):
let
源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
已添加自定义 = Table.AddColumn(源, "自定义", each Text.Remove([数据],{"0".."9"})),
删除的错误 = Table.RemoveRowsWithErrors(已添加自定义, {"自定义"}),
删除的副本 = Table.Distinct(删除的错误, {"自定义"}),
list = List.Generate(()=>Table.RowCount(删除的副本)*2,each _>0,each _ -1),
转换为表 = Table.FromList(list, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
更改的类型1 = Table.TransformColumnTypes(转换为表,{{"Column1", type text}}),
分组 = Table.Group(源, {"日期"}, {{"List", each Record.FromList([数据],更改的类型1[Column1]), type record}}),
#"展开的“List”" = Table.ExpandRecordColumn(分组, "List", {"10", "9", "8", "7", "6", "5", "4", "3", "2", "1"}, {"10", "9", "8", "7", "6", "5", "4", "3", "2", "1"}),
更改的类型 = Table.TransformColumnTypes(#"展开的“List”",{{"日期", type date}})
in
更改的类型
三、方法二:通过分组组合文本再拆分为列
let
源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
更改的类型 = Table.TransformColumnTypes(源,{{"数据", type text}}),
分组的行 = Table.Group(更改的类型, {"日期"}, {{"计数", each Text.Combine([数据],","), type anynonnull}}),
按分隔符拆分列 = Table.SplitColumn(Table.TransformColumnTypes(分组的行, {}, "zh-CN"),"计数",Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv),{"计数.1", "计数.2", "计数.3", "计数.4", "计数.5", "计数.6", "计数.7", "计数.8", "计数.9", "计数.10"}),
更改的类型1 = Table.TransformColumnTypes(按分隔符拆分列,{{"计数.1", type text}, {"计数.2", Int64.Type}, {"计数.3", type text}, {"计数.4", Int64.Type}, {"计数.5", type text}, {"计数.6", Int64.Type}, {"计数.7", type text}, {"计数.8", Int64.Type}, {"计数.9", type text}, {"计数.10", Int64.Type}})
in
更改的类型1
【下载文件】提取同一列中的属性和值的两种方法.xlsx