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

Power Query:基于AnimalType匹配列头替换指定空值的需求实现

Power Query 批量替换CSV列值规则实现

需求逻辑

  1. 读取每行AnimalType列的值(记为$AnimalType[n])
  2. 匹配列名格式为Header{任意三个字符}$AnimalType[n]的列(例如HeaderAaaCAT、HeaderBbbDOG)
  3. 仅当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语言实现步骤

  1. 导入CSV文件到Power Query
  2. 使用以下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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 01:30:32