示例需求:省份清单中“自治区”名称过长,在做报表展示时效果不理想,希望将其替换为简称,例如:内蒙古自治区替换为“内蒙古”。这个直接使用Excel中的替换也可以实现,毕竟只有5个自治区需要替换,接下来看看Power Query中如何实现。
单击选中数据表中任意单元格,例如A6,依次单击【数据】>【自表格/区域】,打开Power Query编辑器。
第一个方法参见:BI神器Power Query(21)-- 同一列内多重替换(1)
M代码如下:
let
源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
更改的类型 = Table.TransformColumnTypes(源,{{"省份", type text}}),
替换的值 = Table.ReplaceValue(更改的类型,"内蒙古自治区","内蒙古",Replacer.ReplaceText,{"省份"}),
替换的值1 = Table.ReplaceValue(替换的值,"宁夏回族自治区","宁夏",Replacer.ReplaceText,{"省份"}),
替换的值2 = Table.ReplaceValue(替换的值1,"新疆维吾尔自治区","新疆",Replacer.ReplaceText,{"省份"}),
替换的值3 = Table.ReplaceValue(替换的值2,"广西壮族自治区","广西",Replacer.ReplaceText,{"省份"}),
替换的值4 = Table.ReplaceValue(替换的值3,"西藏自治区","西藏",Replacer.ReplaceText,{"省份"})
in
替换的值4
第二个方法参见:BI神器Power Query(22)-- 同一列内多重替换(2)
M代码如下:
let
源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
更改的类型 = Table.TransformColumnTypes(源,{{"省份", type text}}),
已添加条件列 = Table.AddColumn(更改的类型, "省份(简)", each if Text.StartsWith([省份], "内蒙") then "内蒙古" else if Text.EndsWith([省份], "自治区") then Text.Middle([省份],0,2) else [省份]),
删除的列 = Table.RemoveColumns(已添加条件列,{"省份"}),
重命名的列 = Table.RenameColumns(删除的列,{{"省份(简)", "省份"}})
in
重命名的列
第一种方法容易理解,但是需要多次替换,第二种方法,替换比较简单,但是需要借助辅助列,如果可以将这两种方法组合起来就好了。接下来就开始DIY …
第一种方法中核心就是如下代码实现替换。
替换的值 = Table.ReplaceValue(更改的类型,"内蒙古自治区","内蒙古",Replacer.ReplaceText,{"省份"})
其语法格式如下,更多详情参考:微软在线文档
Table.ReplaceValue(table as table, oldValue as any, newValue as any, replacer as function, columnsToSearch as list) as table
简单讲的话,就是在columnsToSearch列中将oldValue替换为newValue。
改造后的M代码:
let
源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
替换的值 = Table.ReplaceValue(
源,
each [省份],
each if Text.EndsWith([省份],"自治区")
then (
if Text.StartsWith([省份],"内蒙")
then "内蒙古"
else Text.Middle([省份],0,2)
)
else [省份],
Replacer.ReplaceText,
{"省份"})
in
替换的值
【代码解析】
each [省份]
为oldValue,循环处理每行数据。
替换值的处理逻辑与第二种方法完全相同,使用if判断语句,得到省份简称。
这样在原始数据列进行一次替换,就可以达到目的。更新M代码,效果杠杠的,如下图所示。
如果希望用好PQ,那么还是要学习M语言,大家一起努力吧!