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

如何用Power Query提取单元格内每个D前指定位置的数据?

在Power Query中按规则提取含多个'D'单元格的目标字符

完全可以实现你需要的提取效果,以下是具体的Power Query解决方案,包含两种输出形式:

一、将所有'D'的提取结果合并到单个单元格

  1. 把数据加载到Power Query编辑器:选中数据列,点击「数据」选项卡→「从表格/区域」,确认包含表头后进入编辑器。
  2. 添加自定义列:点击「添加列」→「自定义列」,粘贴以下M语言代码:
= let
    TextContent = [数据内容],
    // 定位文本中所有'D'的索引位置(从0开始计数)
    DPositions = List.PositionOf(Text.ToList(TextContent), "D", Occurrence.All),
    // 对每个'D'的位置提取对应内容
    ExtractItems = List.Transform(DPositions, (pos) =>
        let
            // 提取D前3位数字(判断位置有效性,避免索引越界)
            RedMark = if pos >= 3 then Text.Range(TextContent, pos - 3, 3) else "",
            // 提取D前第4、5位字符/数字
            GreenMark = if pos >= 5 then Text.Range(TextContent, pos - 5, 2) else ""
        in
            "绿色标记:" & GreenMark & " | 红色标记:" & RedMark
    ),
    // 用换行符分隔多个'D'的提取结果
    FinalResult = Text.Combine(ExtractItems, "#(lf)")
in
    FinalResult
  1. 点击「确定」后,每个单元格的提取结果会按换行显示多个'D'的对应内容。

二、将每个'D'的提取结果拆分到单独行

如果需要把每个'D'对应的绿色、红色标记拆分成独立的行和列,可使用以下代码:

  1. 进入Power Query编辑器,添加自定义列,粘贴代码:
= let
    TextContent = [数据内容],
    DPositions = List.PositionOf(Text.ToList(TextContent), "D", Occurrence.All),
    ExtractItems = List.Transform(DPositions, (pos) =>
        [
            绿色标记 = if pos >= 5 then Text.Range(TextContent, pos - 5, 2) else "",
            红色标记 = if pos >= 3 then Text.Range(TextContent, pos - 3, 3) else ""
        ]
    )
in
    ExtractItems
  1. 点击自定义列右侧的展开按钮→「展开到新行」,即可得到每个'D'对应的绿色、红色标记列,每个结果单独一行。

代码说明

  • List.PositionOf(..., Occurrence.All):捕获文本中所有'D'的位置,支持多个'D'的处理需求。
  • if pos >= N判断:避免因文本过短(比如'D'前面不足3位或5位)导致的索引越界错误。
  • Text.Range:按指定起始位置和长度提取子文本,精准匹配你需要的前置字符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 18:40:32