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

Power Query中优化字符串提取小数的M代码问询

问题

我正在尝试从字符串中提取小数,已经有可行的解决方案,但想优化得更精准。

当前能完成需求的M代码:

Source = Excel.CurrentWorkbook(){[Name="Table21"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Column1", type text}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each List.FindText(Text.Split([Column1]," "),".")),
    #"Expanded Custom" = Table.ExpandListColumn(#"Added Custom", "Custom"),
    #"Changed Type1" = Table.TransformColumnTypes(#"Expanded Custom",{{"Custom", type number}}),
    #"Removed Errors" = Table.RemoveRowsWithErrors(#"Changed Type1", {"Custom"})
in
    #"Removed Errors"

现在希望精准提取纯小数,请问在List.FindText(Text.Split([Column1]," "),".")之前添加什么操作,能仅提取纯小数?

示例数据:

Column1预期输出
100298 - 6000.2581 NG Migration & Dismantling Add6000.2581
101536 - 6000.2578 NG Migration & Dismantling CS 66000.2578
101944 - 6000.2578 NG Migration & Dismantling CS 66000.2578
102209 - 6000.2578 NG Migration & Dismantling CS 66000.2578
102856 - 6000.2581 NG Migration & Dismantling Add6000.2581
8000.8500 - car bus bicztytr8000.8500
8000.7072 ertefg gfhfjfgj fghfgh8000.7072
8000.7075 fghgfhg gfhhgjjses8000.7075
8000.7076 rtretretre ter gdb v dffbdtbt8000.7076
8000.7077 wqe ret gfn vbogf8000.7077
8000.8181 gfhg(per lic. for UL900)8000.8181
8000.8254 Mgfhghhode Licenses8000.8254
8000.8254 Multi-mgfhghgode Licenses8000.8254
gfhg(per lic. for UL900) 8000.81818000.8181
gfhg(per lic. for UL900) 8000.81818000.8181
解决方案

不需要在List.FindText前额外操作,直接替换成结合List.Select和类型判断/正则匹配的方式,就能精准提取纯小数,避免误抓带点但不是小数的内容(比如类似abc.xyz的字符串)。

方案1:用类型转换判断(简单直接)

把原代码里的List.FindText(Text.Split([Column1]," "),".")替换为:

List.Select(Text.Split([Column1], " "), each try Value.Is(Value.FromText(_), type number) otherwise false)

修改后的完整M代码:

Source = Excel.CurrentWorkbook(){[Name="Table21"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Column1", type text}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each List.Select(Text.Split([Column1], " "), each try Value.Is(Value.FromText(_), type number) otherwise false)),
    #"Expanded Custom" = Table.ExpandListColumn(#"Added Custom", "Custom"),
    #"Changed Type1" = Table.TransformColumnTypes(#"Expanded Custom",{{"Custom", type number}}),
    #"Removed Errors" = Table.RemoveRowsWithErrors(#"Changed Type1", {"Custom"})
in
    #"Removed Errors"

方案2:用正则匹配(更精准控制格式)

如果需要严格匹配“整数部分+小数点+小数部分”的格式(比如排除.123或123.这类不完整的小数),可以用正则表达式筛选:

List.Select(Text.Split([Column1], " "), each Text.Matches(_, "\d+\.\d+"))

修改后的完整M代码:

Source = Excel.CurrentWorkbook(){[Name="Table21"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Column1", type text}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each List.Select(Text.Split([Column1], " "), each Text.Matches(_, "\d+\.\d+"))),
    #"Expanded Custom" = Table.ExpandListColumn(#"Added Custom", "Custom"),
    #"Changed Type1" = Table.TransformColumnTypes(#"Expanded Custom",{{"Custom", type number}}),
    #"Removed Errors" = Table.RemoveRowsWithErrors(#"Changed Type1", {"Custom"})
in
    #"Removed Errors"

说明

  • 方案1通过尝试转换为数字类型来判断,能兼容更多合法小数格式(比如123.45、0.123、123.如果允许的话),容错性强。
  • 方案2用正则\d+\.\d+严格匹配“至少1位数字+小数点+至少1位数字”的格式,完全符合你的示例数据需求,精准度更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 15:55:33