美文网首页PowerQuery
【实例】利用PowerQuery偷懒又一例

【实例】利用PowerQuery偷懒又一例

作者: PowerQuery | 来源:发表于2016-05-20 21:50 被阅读1176次
    图1

    【图1】是人员信息导入系统的错误记录,由于有些人的信息因为某种原因已经存在于系统了,所以再次导入时会提示“xxx在库中已经存在”。那么我需要将这些xxx提取出来,和原始人员信息比对,找到他们,然后把系统中这些人缺失的新信息手工补充进去(不要问为啥系统没有提供人员信息更新功能,目前它就是无法更新人员)。

    在知道PowerQuery之前,我的做法是:
    1.把错误信息导入Excel
    2.排序
    3.用关键字筛选需要的信息
    4.复制到新表格
    5.替换掉不要的字符,保留需要的字符
    6.打开原始表格,用vlookup函数查询出要修改的人员信息
    7.复制,另存为新表格发给其他同事手动更新
    同样的动作每次都要完完整整来一遍。自从懒癌症患者的我知道PowerQuery之后,就想偷懒简化这个操作——复制错误信息,保存到Excel,刷新,我需要的信息就都出来了。

    现在用PowerQuery,我的工作就很简单了:
    1.建立一个PowerQuery查询,将错误信息分离出来

    let
      源 = Folder.Files("C:\mypath\错误信息"),
      删除的其他列 = Table.SelectColumns(源,{"Content"}),
      已添加自定义 = Table.AddColumn(删除的其他列, "Custom", each Excel.Workbook([Content])),
      #"展开的“Custom”" = Table.ExpandTableColumn(已添加自定义, "Custom", {"Name", "Data", "Item", "Kind", "Hidden"}, {"Name", "Data", "Item", "Kind", "Hidden"}),
      筛选的行 = Table.SelectRows(#"展开的“Custom”", each ([Item] = "Sheet1")),
      更改的类型 = Table.TransformColumnTypes(源,{{"列1", type text}}),
      //因为关键信息是用"[]"括起来的,所以采用分列方式剔除不需要的信息,下面这行代码是第一次分列
      用分隔符分列 = Table.SplitColumn(更改的类型,"列1",Splitter.SplitTextByDelimiter("[", QuoteStyle.Csv),{"列1.1", "列1.2"}),
      更改的类型1 = Table.TransformColumnTypes(用分隔符分列,{{"列1.1", type text}, {"列1.2", type text}}),
      //第二次分列,这样就把需要保留的信息隔离出来了
      用分隔符分列1 = Table.SplitColumn(更改的类型1,"列1.2",Splitter.SplitTextByDelimiter("]", QuoteStyle.Csv),{"列1.2.1", "列1.2.2"}),
      更改的类型2 = Table.TransformColumnTypes(用分隔符分列1,{{"列1.2.1", type text}, {"列1.2.2", type text}}),
      //删除不需要的信息,保留有用信息
      删除的其他列 = Table.SelectColumns(更改的类型2,{"列1.2.1"}),
      //因为有空行,所以删除;如果没空行下面这一步就没必要
      已删除的空行 = Table.SelectRows(删除的其他列, each not List.IsEmpty(List.RemoveMatchingItems(Record.FieldValues(_), {"", null})))
    in
      已删除的空行
    

    2.建立第二个查询将原始人员信息引入,为了避免麻烦,可以直接用“从文件夹新建查询”的方式来引入原始文件,只要保证该文件夹下面只有原始文件就好了,这样懒得每次都要去找文件。换句话说,可以建立一个固定文件夹,将需要使用的原始文件丢到这个文件夹下就ok。
    比如:

    let
      源 = Folder.Files("C:\mypath\原始人员信息"),
      删除的其他列 = Table.SelectColumns(源,{"Content"}),
      已添加自定义 = Table.AddColumn(删除的其他列, "Custom", each Excel.Workbook([Content])),
      #"展开的“Custom”" = Table.ExpandTableColumn(已添加自定义, "Custom", {"Name", "Data", "Item", "Kind", "Hidden"}, {"Name", "Data", "Item", "Kind", "Hidden"}),
      筛选的行 = Table.SelectRows(#"展开的“Custom”", each ([Item] = "用户信息采集表")),
      删除的其他列1 = Table.SelectColumns(筛选的行,{"Data"}),
      #"展开的“Data”" = Table.ExpandTableColumn(删除的其他列1, "Data", {"Column1", "Column2", "Column3", "Column4", "Column5", "Column6", "Column7", "Column8", "Column9", "Column10", "Column11", "Column12", "Column13", "Column14", "Column15", "Column16", "Column17", "Column18", "Column19"}, {"Column1", "Column2", "Column3", "Column4", "Column5", "Column6", "Column7", "Column8", "Column9", "Column10", "Column11", "Column12", "Column13", "Column14", "Column15", "Column16", "Column17", "Column18", "Column19"}),
      更改的类型 = Table.TransformColumnTypes(#"展开的“Data”",{{"Column14", type text}})
    in
      更改的类型
    

    3.新建一个合并查询,将筛选出来的信息作为关键字段来与原始人员信息比对,采用Table.NestedJoin的JoinKind.Inner参数,将结果稍作整理,加载到表,即可输出最终想要的结果。

    4.最重要的是,上述工作我只需要做一次,以后我要处理类似的工作,直接将错误信息丢到“错误信息”文件夹,将原始人员信息丢到“原始人员信息”文件夹,打开模板,刷新一下,就自动得出我想要的结果来了。

    相关文章

      网友评论

      • JIAN7:是不是需要代码基础呀
        有入门的教程吗
        PowerQuery:@JIAN7 应该不怎么需要。绝大部分工作可以在界面中用鼠标完成。百度有个入门教程,您可以搜下。但我觉得不咋样。最好的入门教材应该是powerbi的官方课程,您可以到power bi官网搜下。目前国内中文资料特少。有个qq群叫excel120,里边关于这个的牛人很多,还有很多资料电子书之类。您可以试试看。

      本文标题:【实例】利用PowerQuery偷懒又一例

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