Power Query:基于AnimalType匹配列头替换指定空值的需求实现
Power Query 批量替换CSV列值规则实现
需求逻辑
- 读取每行
AnimalType列的值(记为$AnimalType[n]) - 匹配列名格式为
Header{任意三个字符}$AnimalType[n]的列(例如HeaderAaaCAT、HeaderBbbDOG) - 仅当
DateBegin列日期属于过去30天时,若匹配到的列值为空,则将其替换为DateBegin列的值
已知取值范围
$AnimalType[n]可选值:"CAT"、"DOG"、null(暂无需处理其他值)- 目标匹配列名格式:
Header+ 任意三个字符 +$AnimalType[n],后续可能扩展更多此类列
逻辑伪代码
IF ( 列名 = "Header"&任意三个字符&$AnimalType[n] AND Date.IsInPreviousNDays($DateBegin[n], 30) AND 当前匹配列值 = null ) THEN 当前匹配列值 = $DateBegin[n] ELSE 保留当前匹配列值不变
示例符合条件的行
- 第8行:仅替换
HeaderAaaDOG列空值(HeaderBbbDOG列有值) - 第12行:两个CAT相关列均为空,需全部替换
- 第24行:两个DOG相关列均为空,需全部替换
Power Query M语言实现步骤
- 导入CSV文件到Power Query
- 使用以下M语言代码实现替换逻辑:
let 源 = Csv.Document(File.Contents("你的CSV文件路径"), [Delimiter=",", Encoding=65001, QuoteStyle=QuoteStyle.Csv]), 提升标题 = Table.PromoteHeaders(源, [PromoteAllScalars=true]), 转换日期类型 = Table.TransformColumns(提升标题, {{"DateBegin", each Date.From(_), type date}}), 获取所有列名 = Table.ColumnNames(转换日期类型), 定义行替换逻辑 = (行 as record) as record => let 当前动物类型 = record.FieldOrDefault(行, "AnimalType", null), 当前开始日期 = record.FieldOrDefault(行, "DateBegin", null), 日期符合条件 = not 当前开始日期 = null and Date.IsInPreviousNDays(当前开始日期, 30), 目标列后缀 = if 当前动物类型 = null then "" else 当前动物类型, // 筛选符合格式的目标列:Header开头+3字符+动物类型结尾,总长度11 匹配目标列 = List.Select(获取所有列名, each Text.StartsWith(_, "Header") and Text.EndsWith(_, 目标列后缀) and Text.Length(_) = 11), // 遍历目标列完成空值替换 逐列替换 = List.Accumulate(匹配目标列, 行, (当前行, 列名) => let 当前列值 = record.FieldOrDefault(当前行, 列名, null), 新列值 = if 日期符合条件 and 当前列值 = null then 当前开始日期 else 当前列值 in Record.ReplaceFields(当前行, {[Name=列名, Value=新列值]}) ) in 逐列替换, 应用替换到所有行 = Table.TransformRows(转换日期类型, 定义行替换逻辑), 转换为表格 = Table.FromRecords(应用替换到所有行) in 转换为表格
代码说明
- 通过
Text.StartsWith、Text.EndsWith和长度判断精准筛选目标列,适配后续列扩展需求 - 用
List.Accumulate遍历匹配列,逐列判断替换条件,避免重复逻辑 - 先转换
DateBegin为标准日期类型,确保日期判断逻辑准确
内容的提问来源于stack exchange,提问作者Sas
相关产品推荐
相关产品推荐

