使用电源查询按数字字符串的最小长度从文本中提取数字
Extract numbers from text by minimum length of number string using power query
问题
我的任务是整理一些包含文本和数字混合的非常混乱的数据,并希望使用 power query 将代码与数据分开。幸运的是,需要分隔的代码仅由数值组成,长度似乎为 7 个字符(假设为 6 个或更大)。
下面是我希望如何分离数据的示例:
到目前为止:
到目前为止我有这个代码:
let
Source = Excel.CurrentWorkbook(){[Name="Table5"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Input ", type text}}),
#"Replaced Value" = Table.ReplaceValue(#"Changed Type","_"," ",Replacer.ReplaceText,{"Input "}),
#"Replaced Value1" = Table.ReplaceValue(#"Replaced Value","v"," ",Replacer.ReplaceText,{"Input "}),
#"Added Custom" = Table.AddColumn(#"Replaced Value1", "TextSplit", each Text.Split([#"Input "], " ")),
#"Added Custom1" = Table.AddColumn(#"Added Custom", "ListTransform", each List.Transform([TextSplit], each Text.Select(_,{"0".."9"}))),
#"Added Custom2" = Table.AddColumn(#"Added Custom1", "ListSelect", each List.Select([ListTransform], each Text.Length(_)>=5)),
#"Added Custom3" = Table.AddColumn(#"Added Custom2", "TextCombine", each Text.Combine([ListSelect], ", ")),
#"Removed Columns" = Table.RemoveColumns(#"Added Custom3",{"TextSplit", "ListTransform", "ListSelect"})
在
#“删除的列”
这似乎确实解决了问题。然而,在像 0102646v2.0
这样的情况下,这会被作为 010264620
通过。为了让它工作,我不得不介绍用“”替换_和“v”的步骤。 Power Query 是否无法识别说 0102646v2.0
应该提取为 0102646
?
数据:
Input Values:
3159087 v1.0
3194070 v1.0
#8102368 V3.0 (Shine and ProtectR18)
#8102371 V4.0 (Lemon 12A Degreaser)
Marine (FF3080300 v1.0)
Green Apple (FF3080301 v1.0)
0102646v2.0 (Fresh Cotton)
TDS# 3129801 V1.0 GPA Code#3123402
FF3112964 0.1 FF3145524 0.1_3152912 0.1
谢谢!
更新:拉取版本号
正则表达式
您可以 extract numbers 使用以下代码从文本中获取:
= Table.AddColumn(#"PreviousStep", "MyNumberColumn", each Text.Select([Input], {"0".."9"}))
这将为您提供字符串中相同顺序的所有数字。如果您的实际数字长度恰好是 7 个字符,您应该也可以使用 Excel 公式来提取它。
或者如果您更喜欢使用 Power Query 拆分文本,您可以
- 使用字符数拆分列,然后(主页 > 拆分列(下拉菜单)> 按字符数)
- 使用分隔符合并列(Select 列 > 转到添加列选项卡 > 合并列)
注意:您需要根据您的查询编辑 PreviousStep
和 Input
这是使用 Regex 提取模式并以逗号分隔返回它们的 PQ 实现:
将此添加为自定义函数。我把它命名为fnRegexExtr
//see http://www.thebiccountant.com/2018/04/25/regex-in-power-bi-and-power-query-in-excel-with-java-script/
// and https://gist.github.com/Hugoberry/4948d96b45d6799c47b4b9fa1b08eadf
let fx=(text,regex)=>
Web.Page(
"<script>
var x='"&text&"';
var y=new RegExp('"®ex&"','g');
var b=x.match(y);
document.write(b);
</script>")[Data]{0}[Children]{0}[Children]{1}[Text]{0}
in
fx
然后您可以像这样在您的代码中使用它:
let
Source = Excel.CurrentWorkbook(){[Name="Table10"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Input", type text}}),
#"Added Custom" = Table.AddColumn(#"Changed Type", "Output",
each fnRegexExtr([Input], "[0-9]{6,}"))
in
#"Added Custom"
哪个returns:
问题 我的任务是整理一些包含文本和数字混合的非常混乱的数据,并希望使用 power query 将代码与数据分开。幸运的是,需要分隔的代码仅由数值组成,长度似乎为 7 个字符(假设为 6 个或更大)。
下面是我希望如何分离数据的示例:
到目前为止: 到目前为止我有这个代码:
let
Source = Excel.CurrentWorkbook(){[Name="Table5"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Input ", type text}}),
#"Replaced Value" = Table.ReplaceValue(#"Changed Type","_"," ",Replacer.ReplaceText,{"Input "}),
#"Replaced Value1" = Table.ReplaceValue(#"Replaced Value","v"," ",Replacer.ReplaceText,{"Input "}),
#"Added Custom" = Table.AddColumn(#"Replaced Value1", "TextSplit", each Text.Split([#"Input "], " ")),
#"Added Custom1" = Table.AddColumn(#"Added Custom", "ListTransform", each List.Transform([TextSplit], each Text.Select(_,{"0".."9"}))),
#"Added Custom2" = Table.AddColumn(#"Added Custom1", "ListSelect", each List.Select([ListTransform], each Text.Length(_)>=5)),
#"Added Custom3" = Table.AddColumn(#"Added Custom2", "TextCombine", each Text.Combine([ListSelect], ", ")),
#"Removed Columns" = Table.RemoveColumns(#"Added Custom3",{"TextSplit", "ListTransform", "ListSelect"})
在 #“删除的列”
这似乎确实解决了问题。然而,在像 0102646v2.0
这样的情况下,这会被作为 010264620
通过。为了让它工作,我不得不介绍用“”替换_和“v”的步骤。 Power Query 是否无法识别说 0102646v2.0
应该提取为 0102646
?
数据:
Input Values:
3159087 v1.0
3194070 v1.0
#8102368 V3.0 (Shine and ProtectR18)
#8102371 V4.0 (Lemon 12A Degreaser)
Marine (FF3080300 v1.0)
Green Apple (FF3080301 v1.0)
0102646v2.0 (Fresh Cotton)
TDS# 3129801 V1.0 GPA Code#3123402
FF3112964 0.1 FF3145524 0.1_3152912 0.1
谢谢!
更新:拉取版本号
正则表达式
您可以 extract numbers 使用以下代码从文本中获取:
= Table.AddColumn(#"PreviousStep", "MyNumberColumn", each Text.Select([Input], {"0".."9"}))
这将为您提供字符串中相同顺序的所有数字。如果您的实际数字长度恰好是 7 个字符,您应该也可以使用 Excel 公式来提取它。
或者如果您更喜欢使用 Power Query 拆分文本,您可以
- 使用字符数拆分列,然后(主页 > 拆分列(下拉菜单)> 按字符数)
- 使用分隔符合并列(Select 列 > 转到添加列选项卡 > 合并列)
注意:您需要根据您的查询编辑 PreviousStep
和 Input
这是使用 Regex 提取模式并以逗号分隔返回它们的 PQ 实现:
将此添加为自定义函数。我把它命名为fnRegexExtr
//see http://www.thebiccountant.com/2018/04/25/regex-in-power-bi-and-power-query-in-excel-with-java-script/
// and https://gist.github.com/Hugoberry/4948d96b45d6799c47b4b9fa1b08eadf
let fx=(text,regex)=>
Web.Page(
"<script>
var x='"&text&"';
var y=new RegExp('"®ex&"','g');
var b=x.match(y);
document.write(b);
</script>")[Data]{0}[Children]{0}[Children]{1}[Text]{0}
in
fx
然后您可以像这样在您的代码中使用它:
let
Source = Excel.CurrentWorkbook(){[Name="Table10"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Input", type text}}),
#"Added Custom" = Table.AddColumn(#"Changed Type", "Output",
each fnRegexExtr([Input], "[0-9]{6,}"))
in
#"Added Custom"
哪个returns: