如何在Power Query中排除包含指定内容的完整Session?
在Power Query中过滤包含特定内容的完整Session记录
核心逻辑和你熟悉的TSQL嵌套查询一致:先定位所有存在违规内容的SessionId,再从原表中排除这些Session的全部行。以下是两种实现方式:
一、可视化界面操作(适合新手)
假设你已经把CSV导入Power Query编辑器:
- 筛选违规记录:点击
SessionContent列的筛选按钮 → 选「文本筛选」→「包含」,输入Some Data I don't want be in table,确定后得到所有含违规内容的行。 - 提取并去重坏SessionId:选中
SessionId列,右键→「删除其他列」,再点击顶部菜单栏的「删除重复项」,得到需要排除的SessionId列表(可将这个查询重命名为BadSessions)。 - 返回原表过滤:切换回原始数据查询,点击「合并查询」→「合并为新查询」:
- 第一个表选原始数据,第二个表选
BadSessions - 匹配列都选
SessionId,连接类型选左反(左反连接会保留原表中不在BadSessions里的所有行)
- 第一个表选原始数据,第二个表选
- 加载合并后的结果到Excel即可。
二、M代码实现(灵活高效)
直接编写M代码可以跳过界面操作的繁琐,适合需要自动化或批量处理的场景:
let // 1. 导入CSV(替换为你的文件路径) Source = Csv.Document(File.Contents("C:\YourPath\data.csv"), [Delimiter=",", Encoding=1252, QuoteStyle=QuoteStyle.None]), // 2. 提升标题行并设置数据类型 PromotedHeaders = Table.PromoteHeaders(Source, [PromoteAllScalars=true]), ChangedType = Table.TransformColumnTypes(PromotedHeaders,{{"SessionId", type text}, {"SequenceNumber", Int64.Type}, {"SessionContent", type text}}), // 3. 提取所有含违规内容的SessionId并去重 BadSessions = Table.Distinct(Table.SelectRows(ChangedType, each Text.Contains([SessionContent], "Some Data I don't want be in table"))[SessionId]), // 4. 过滤掉所有坏Session的行 FilteredTable = Table.SelectRows(ChangedType, each not List.Contains(BadSessions, [SessionId])) in FilteredTable
代码说明:
BadSessions:先筛选出含违规文本的行,再提取SessionId列并去重,得到需要排除的Session列表。FilteredTable:遍历原表每一行,只保留SessionId不在BadSessions里的记录。
注意事项
- 文本匹配默认区分大小写,如需忽略大小写,可修改为
Text.Contains(Text.Lower([SessionContent]), Text.Lower("Some Data I don't want be in table")) - 确保
SessionId的数据类型在原表和BadSessions中一致(比如都是文本或数值),否则会出现匹配失败。
内容的提问来源于stack exchange,提问作者Posix
相关产品推荐
相关产品推荐

