Power Query中从含多引号长字符串提取"s":"b"子串
提取JSON字符串中特定键值对到Power Query新列的方法
没问题,我来帮你搞定这个Power Query里的文本提取需求!你提到的转义问题确实是M语言里的关键点,我会用纯文本函数给你两种解决方案,对应不同的提取目标:
1. 提取s键对应的纯值(比如b)
如果你的目标是获取s键的值而非完整的键值对片段,用Text.BetweenDelimiters是最简洁的方式。记住在M语言里,双引号需要用两个双引号转义,所以我们要把目标分隔符正确转义:
添加自定义列时使用这个公式(替换[JSON_Text]为你的实际列名):
Text.Trim(Text.BetweenDelimiters([JSON_Text], """s"":""""", """,""""), """")
公式解释:
"""s"":""""":转义后对应字符串"s":",作为提取的起始标记""",""":转义后对应字符串",,作为提取的结束标记Text.Trim(..., """"):自动去掉结果两端的双引号,直接得到纯值b
要是你需要保留值的双引号(比如得到"b"),去掉外层的Text.Trim就行:
Text.BetweenDelimiters([JSON_Text], """s"":""""", ""","""")
2. 提取完整的"s":"b"键值对片段
如果必须提取整个"s":"b"字符串,我们可以结合Text.PositionOf定位位置,再用Text.Range截取内容:
let StartPos = Text.PositionOf([JSON_Text], """s"":"""""), EndPos = if StartPos <> -1 then Text.PositionOf([JSON_Text], """", StartPos + 6) else -1, Extracted = if StartPos <> -1 then Text.Range([JSON_Text], StartPos, EndPos - StartPos + 1) else null in Extracted
公式解释:
- 先检查
s键是否存在(StartPos <> -1),避免找不到内容时报错 - 定位起始位置后,从
"s":"的末尾开始找下一个双引号,确定结束位置 - 最后用
Text.Range截取从起始到结束的完整片段,得到"s":"b"
快速操作步骤
- 打开Power Query编辑器,选中你的JSON文本列
- 点击顶部菜单栏的添加列 → 自定义列
- 把上面的公式粘贴进去,替换
[JSON_Text]为你的列名 - 点击确定,新列就会显示你要的内容啦!
内容的提问来源于stack exchange,提问作者Marko Jelic




