如何用Power Query提取单元格内每个D前指定位置的数据?
在Power Query中按规则提取含多个'D'单元格的目标字符
完全可以实现你需要的提取效果,以下是具体的Power Query解决方案,包含两种输出形式:
一、将所有'D'的提取结果合并到单个单元格
- 把数据加载到Power Query编辑器:选中数据列,点击「数据」选项卡→「从表格/区域」,确认包含表头后进入编辑器。
- 添加自定义列:点击「添加列」→「自定义列」,粘贴以下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
- 点击「确定」后,每个单元格的提取结果会按换行显示多个'D'的对应内容。
二、将每个'D'的提取结果拆分到单独行
如果需要把每个'D'对应的绿色、红色标记拆分成独立的行和列,可使用以下代码:
- 进入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
- 点击自定义列右侧的展开按钮→「展开到新行」,即可得到每个'D'对应的绿色、红色标记列,每个结果单独一行。
代码说明
List.PositionOf(..., Occurrence.All):捕获文本中所有'D'的位置,支持多个'D'的处理需求。if pos >= N判断:避免因文本过短(比如'D'前面不足3位或5位)导致的索引越界错误。Text.Range:按指定起始位置和长度提取子文本,精准匹配你需要的前置字符。
内容的提问来源于stack exchange,提问作者MMM
相关产品推荐
相关产品推荐

