使用power query快速合并学生各科目成绩

例子:下面是学生的考试成绩表,要求将其合并到一列中,用“/”分隔,没有考试成绩的不显示。

最终结果图:

具体实现步骤:

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
    // 输出最终表
    删除的列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值