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 Add | 6000.2581 |
| 101536 - 6000.2578 NG Migration & Dismantling CS 6 | 6000.2578 |
| 101944 - 6000.2578 NG Migration & Dismantling CS 6 | 6000.2578 |
| 102209 - 6000.2578 NG Migration & Dismantling CS 6 | 6000.2578 |
| 102856 - 6000.2581 NG Migration & Dismantling Add | 6000.2581 |
| 8000.8500 - car bus bicztytr | 8000.8500 |
| 8000.7072 ertefg gfhfjfgj fghfgh | 8000.7072 |
| 8000.7075 fghgfhg gfhhgjjses | 8000.7075 |
| 8000.7076 rtretretre ter gdb v dffbdtbt | 8000.7076 |
| 8000.7077 wqe ret gfn vbogf | 8000.7077 |
| 8000.8181 gfhg(per lic. for UL900) | 8000.8181 |
| 8000.8254 Mgfhghhode Licenses | 8000.8254 |
| 8000.8254 Multi-mgfhghgode Licenses | 8000.8254 |
| gfhg(per lic. for UL900) 8000.8181 | 8000.8181 |
| gfhg(per lic. for UL900) 8000.8181 | 8000.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
相关产品推荐
相关产品推荐

