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