美文网首页PowerQuery
【转载】提取同一列中的属性和值的两种方法

【转载】提取同一列中的属性和值的两种方法

作者: PowerQuery | 来源:发表于2017-04-02 10:29 被阅读150次

    【声明】这两个方法均来自于QQ群453524740。原创者为上海-SEM-施阳。转载到此也是为了记录和保存,避免淹没在QQ聊天记录中而流失。
    一、需求
    如表1所示,数据列同时包含了属性和值,现在需要将其整理成表2的形式。


    表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

    相关文章

      网友评论

        本文标题:【转载】提取同一列中的属性和值的两种方法

        本文链接:https://www.haomeiwen.com/subject/xwfgottx.html