PowerQuery语法实现:基于文本匹配列标题动态填充行数据
PowerQuery语法实现:基于文本匹配列标题动态填充行数据
嗨,我来帮你搞定这个PowerQuery里的匹配填充问题~你之前遇到的笛卡尔积问题,是因为拆分后直接展开导致的,咱们换个思路,针对每一行单独判断列标题和许可证值的匹配关系就可以解决啦。
下面是具体的实现步骤和M代码,你可以直接套用:
核心思路
先提取所有需要填充的目标列标题,然后对每一行把License Details字段拆分成值列表,逐一检查每个列标题是否在这个列表里,匹配的就填true,不匹配的留null(或者你想填false也可以改代码)。
完整M代码示例
假设你的数据源表名叫Source,直接把这段代码替换到PowerQuery的高级编辑器里就行:
let Source = 你的数据源(替换成实际的数据源步骤), // 获取除了License Details之外的所有目标列名 targetColumns = List.RemoveItems(Table.ColumnNames(Source), {"License Details"}), // 为每一行生成匹配结果的记录 AddTempRecord = Table.AddColumn(Source, "TempMatch", (currentRow) => let // 拆分License Details为值列表,这里用", "作为分隔符,根据实际情况调整 LicenseList = Text.Split(currentRow[License Details], ", "), // 遍历所有目标列,判断是否匹配 MatchResults = List.Transform(targetColumns, (colName) => if List.Contains(LicenseList, colName) then true else null // 如果需要忽略大小写匹配,就把上面一行换成下面的: // if List.Contains(LicenseList, colName, Comparer.OrdinalIgnoreCase) then true else null ) in // 把匹配结果列表转成对应列名的记录 Record.FromList(MatchResults, targetColumns) ), // 展开临时记录列,替换原来的空列 ExpandTempColumns = Table.ExpandRecordColumn(AddTempRecord, "TempMatch", targetColumns, targetColumns), // 可选:删除临时列(如果不需要的话) RemoveTempColumn = Table.RemoveColumns(ExpandTempColumns, {"TempMatch"}) in RemoveTempColumn
关键细节说明
- 分隔符调整:如果你的
License Details字段里的多个值不是用,分隔的,比如是分号;或者空格,记得修改Text.Split的第二个参数。 - 大小写匹配:如果存在大小写不一致的情况(比如列标题是
POWERAPPS_VIRAL但字段里是powerapps_viral),可以启用代码里注释的忽略大小写匹配逻辑。 - 替代null为false:如果你不想留
null,想统一填false,只需要把代码里的else null改成else false就行。
这样处理后,每一行只会根据自身的License Details值来填充对应列的布尔值,不会产生多余的笛卡尔积行啦。
备注:内容来源于stack exchange,提问作者Bii
相关产品推荐
相关产品推荐

