【注】此案例来自于“M与DAX的恩怨纠葛” 讨论群(群号:545814382),方法都不是我原创,我只是收集整理。
原始文件
链接:http://pan.baidu.com/s/1eSIL40U 密码:58c8
分析
这个表格处理的关键在于如何替换换行符。如果知道软换行符是“#(lf)”,就比较好办。如果不知道这个软换行符,就只能百度了(这是我的下意识做法,然而并没有搜出来正确结果)。其实PowerQuery的UI直接给出了替换这类换行符的方法。
在“开始”选项卡,点击“拆分列”,弹出下图拆分列的对话框。选择“自定义”,选择“每次出现分隔符时”(PowerQuery大多数时候都是自动选择此选项),点击“高级选项”展开子菜单,勾选“使用特殊字符进行拆分”,点击“插入特殊字符”下拉菜单,选择“换行”,确定。
在这个界面,如果好奇心起,在“高级选项”里的“拆分为”勾选“行”,有惊喜。其实这正是下面的方法一的关键。
方法一:直接用SplitColumn()函数。此方法为施阳给出。【推荐】
let
源 = Excel.CurrentWorkbook(){[Name="测试"]}[Content],
自定义1 = Table.ExpandListColumn(Table.AddColumn(源,"自定义",each Text.Split([业绩],"#(lf)")),"自定义"),
按分隔符拆分列 = Table.SplitColumn(自定义1, "自定义", Splitter.SplitTextByDelimiter("/", QuoteStyle.Csv), {"自定义.1", "自定义.2"})
in
按分隔符拆分列
上面的“自定义1”这一步,施阳大侠其实是合并了若干步骤,并且在保护原始数据时,新增了一列作为拆分列。
我们也可以一步一步利用UI先拆分换行符,再用“/”来拆分列。这样做的好处是直观,坏处是代码不够简洁。
方法二:使用SplitColumn()和UnpivotOtherColumns()
这个方法是我从施阳大侠处获得换行符的代码之后,照着@R is for Data Robot大侠提示,照猫画虎做出来的。比方法一多了一步骤,但也不失为一种思路。
let
源 = Excel.CurrentWorkbook(){[Name="测试"]}[Content],
按分隔符拆分列 = Table.SplitColumn(源, "业绩", Splitter.SplitTextByDelimiter("#(lf)", QuoteStyle.Csv), {"业绩.1", "业绩.2", "业绩.3"}),
逆透视的列 = Table.UnpivotOtherColumns(按分隔符拆分列, {"姓名"}, "属性", "值"),
按分隔符拆分列1 = Table.SplitColumn(逆透视的列, "值", Splitter.SplitTextByDelimiter("/", QuoteStyle.Csv), {"值.1", "值.2"})
in
按分隔符拆分列1