You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Power Query去除单元格内文本字符串的重复值

Power Query 合并单元格内文本去重方案

问题原因

分组聚合阶段直接对原始地址列执行Text.Combine时,未提前过滤同组内重复的邮箱地址,导致合并后单个单元格内出现重复值。

最优实现方式

不建议先合并成文本再拆分去重,直接在分组聚合逻辑中用List.Distinct()对分组内的地址列表先去重,再执行文本合并,逻辑最简、性能最高。

修改位置

原代码第一次分组步骤#"Grouped Rows"中的聚合逻辑,原写法直接传入原始列做合并:

{"cc_address", each Text.Combine([CcRecipients.Address],", "), type text}, 
{"to_address", each Text.Combine([ToRecipients.Address],", "), type text}

给待合并的列表套一层List.Distinct()即可完成去重,修改后:

{"cc_address", each Text.Combine(List.Distinct([CcRecipients.Address]),", "), type text}, 
{"to_address", each Text.Combine(List.Distinct([ToRecipients.Address]),", "), type text}

修改后完整M代码

let
    Source = Exchange.Contents("giang.phan@abc.com"),
    Mail1 = Source{[Name="Mail"]}[Data],
    #"Reordered Columns" = Table.ReorderColumns(Mail1,{"DateTimeSent", "DateTimeReceived", "Folder Path", "Subject", "Sender", "DisplayTo", "DisplayCc", "ToRecipients", "CcRecipients", "BccRecipients", "Importance", "Categories", "IsRead", "HasAttachments", "Attachments", "Preview", "Attributes", "Body", "Id"}),
    #"Filtered Rows" = Table.SelectRows(#"Reordered Columns", each [DateTimeReceived] > #datetime(2021, 12, 29, 0, 0, 0) and [DateTimeReceived] < #datetime(2022, 1, 4, 0, 0, 0)),
    #"Expanded ToRecipients" = Table.ExpandTableColumn(#"Filtered Rows", "ToRecipients", {"Address"}, {"ToRecipients.Address"}),
    #"Expanded CcRecipients" = Table.ExpandTableColumn(#"Expanded ToRecipients", "CcRecipients", {"Address"}, {"CcRecipients.Address"}),
    #"Removed Columns" = Table.RemoveColumns(#"Expanded CcRecipients",{"BccRecipients", "Importance", "Categories", "IsRead", "HasAttachments", "Attachments", "Preview", "Attributes"}),
    #"Reordered Columns1" = Table.ReorderColumns(#"Removed Columns",{"Id", "DateTimeSent", "DateTimeReceived", "Folder Path", "Subject", "Sender", "DisplayTo", "DisplayCc", "ToRecipients.Address", "CcRecipients.Address", "Body"}),
    #"Grouped Rows" = Table.Group(#"Reordered Columns1", {"Id", "DateTimeSent", "DateTimeReceived", "Folder Path", "Subject", "DisplayTo", "DisplayCc"}, {
        {"cc_address", each Text.Combine(List.Distinct([CcRecipients.Address]),", "), type text}, 
        {"to_address", each Text.Combine(List.Distinct([ToRecipients.Address]),", "), type text}
    }),
    #"Grouped Rows1" = Table.Group(#"Grouped Rows", {"Id", "DateTimeSent", "DateTimeReceived", "Folder Path", "DisplayTo", "DisplayCc", "cc_address", "to_address"}, {{"Last_time receive", each List.Max([DateTimeReceived]), type datetime}, {"Last_subject", each List.Max([Subject]), type nullable text}}),
    #"Removed Other Columns" = Table.SelectColumns(#"Grouped Rows1",{"Id", "DateTimeSent", "DateTimeReceived", "Folder Path", "DisplayTo", "DisplayCc", "cc_address", "to_address", "Last_time receive", "Last_subject"})
in
    #"Removed Other Columns"

事后补救方案

如果不想修改原有分组逻辑,也可以在分组步骤完成后新增自定义列,对已经合并完成的文本执行「按分隔符拆分-列表去重-重新合并」操作,以cc_address列为例,自定义列公式如下:

Text.Combine(List.Distinct(Splitter.SplitTextByDelimiter(", ")([cc_address])),", ")

to_address列替换对应列名即可。

注意:该方案需要额外执行文本拆分操作,数据量较大时性能弱于分组阶段直接去重的方案,优先选择前者。

内容的提问来源于stack exchange,提问作者thangvc91

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.20 16:15:48