例子:下面是学生的考试成绩表,要求将其合并到一列中,用“/”分隔,没有考试成绩的不显示。
最终结果图:
具体实现步骤:
1、在【数据】选项卡下找到【来自表格/区域】,点击后弹出一个对话框,勾选【表包含标题】。
2、进入PQ界面,点击【视图】选项卡下面的【高级编辑器】,弹出一个对话框,将原有的代码替换成下列代码:
let
// 从Excel工作簿加载数据
源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
// 更改列的数据类型
更改的类型 = Table.TransformColumnTypes(源,{{"姓名", type text}, {"语文", Int64.Type}, {"数学", Int64.Type}, {"英语", Int64.Type}, {"化学", Int64.Type}}),
// 给成绩列添加前缀
添加前缀到成绩 = Table.TransformColumns(更改的类型, {
{"语文", each "语文: " & Text.From(_), type text},
{"数学", each "数学: " & Text.From(_), type text},
{"英语", each "英语: " & Text.From(_), type text},
{"化学", each "化学: " & Text.From(_), type text}
}),
// 合并成绩列为一个新列
合并成绩 = Table.AddColumn(添加前缀到成绩, "合并后的成绩", each
Text.Combine(
List.Transform(
{_[语文], _[数学], _[英语], _[化学]},
each if _ <> null then Text.From(_) else ""
),
"/"
)
)
in
// 输出最终表
合并成绩
如下图所示,点击【完成】按钮。
处理后的结果如下图所示,但是发现合并后的内容首末存在单独的“/”,还存在“//”的情况,下面来处理这个问题。
3、首先解决列中内容存在“//”的情况:选中目标列,点击【转换】选项卡下面的【替换值】,输入要替换的值和替换的目标值,点击确定。
4、再解决内容首末存在“/”的情况:点击【添加列】选项卡下面的【自定义列】,在弹出的对话框中输入相应的新列名和自定义列公式,点击确定。
each let
// 获取当前行的 [合并后的成绩] 值
成绩 = [合并后的成绩],
// 检查是否以斜杠开头,并删除它(如果之前代码已处理开头斜杠,则此步骤可能已不必要)
无开头斜杠成绩 = if Text.StartsWith(成绩, "/") then Text.RemoveRange(成绩, 0, 1) else 成绩,
// 检查是否以斜杠结尾,并删除它
最终成绩 = if Text.EndsWith(无开头斜杠成绩, "/") then Text.RemoveRange(无开头斜杠成绩, Text.Length(无开头斜杠成绩) - 1, 1) else 无开头斜杠成绩
in
最终成绩
5、删除不需要的列:选中第一列和最后一列,点击【主页】选项卡下面【删除列】中的【删除其他列】。
6、最后更改工作表名称,点击【关闭并上载】就可以得到最终想要的结果了。
偷个懒,如果下次再遇到这种情况,可以直接套公式,打开【高级编辑器】直接把代码粘贴进去就可以了,前提是注意表头名称是否有更改。
let
// 从Excel工作簿加载数据
源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
// 更改列的数据类型
更改的类型 = Table.TransformColumnTypes(源,{{"姓名", type text}, {"语文", Int64.Type}, {"数学", Int64.Type}, {"英语", Int64.Type}, {"化学", Int64.Type}}),
// 给成绩列添加前缀
添加前缀到成绩 = Table.TransformColumns(更改的类型, {
{"语文", each "语文" & Text.From(_), type text},
{"数学", each "数学" & Text.From(_), type text},
{"英语", each "英语" & Text.From(_), type text},
{"化学", each "化学" & Text.From(_), type text}
}),
// 合并成绩列为一个新列
合并成绩 = Table.AddColumn(添加前缀到成绩, "合并后的成绩", each
Text.Combine(
List.Transform(
{_[语文], _[数学], _[英语], _[化学]},
each if _ <> null then Text.From(_) else ""
),
"/"
)
),
替换的值 = Table.ReplaceValue(合并成绩,"//","/",Replacer.ReplaceText,{"合并后的成绩"}),
已添加自定义 = Table.AddColumn(替换的值, "最终合并后的成绩", each let
// 获取当前行的 [合并后的成绩] 值
成绩 = [合并后的成绩],
// 检查是否以斜杠开头,并删除它(如果之前代码已处理开头斜杠,则此步骤可能已不必要)
无开头斜杠成绩 = if Text.StartsWith(成绩, "/") then Text.RemoveRange(成绩, 0, 1) else 成绩,
// 检查是否以斜杠结尾,并删除它
最终成绩 = if Text.EndsWith(无开头斜杠成绩, "/") then Text.RemoveRange(无开头斜杠成绩, Text.Length(无开头斜杠成绩) - 1, 1) else 无开头斜杠成绩
in
最终成绩
),
删除的列 = Table.RemoveColumns(已添加自定义,{"语文", "数学", "英语", "化学", "合并后的成绩"})
in
// 输出最终表
删除的列