仅保留字符串中的数字/删除所有非数字

时间:2017-08-01 23:40:00

标签: powerbi powerquery m

我有一个字符串列,我只需要每个字符串中的数字,例如

A-123  -> 123
456    -> 456
7-X89  -> 789   

如何在PowerQuery中完成?

3 个答案:

答案 0 :(得分:4)

添加列。在自定义列公式中,输入以下内容:

= Text.Select( [Column], {"0".."9"} )

其中[Column]是包含数字和其他字符的字符串列。它仅提取数字。

答案 1 :(得分:1)

首先,使用新查询在PowerQuery中创建自定义函数 - 来自其他来源 - >空白查询。打开高级编辑器并粘贴以下代码:

(source) => 
let
    NumbersOnly = (char) => if Character.ToNumber(char) >=48 and Character.ToNumber(char) < 58 then char else "",
    Len = Text.Length(source),
    Acc = List.Accumulate(
                   List.Generate( () => 0, each _ < Len, each _ + 1), 
                   "", 
                   (acc, index) => acc& NumbersOnly(Text.At(source, index))
               ),
    AsNumber = Number.FromText(Acc)
in
    AsNumber

将此查询命名为NumbersOnly

现在在您的主查询中,添加另一个计算列,您可以使用源列调用此NumbersOnly函数,例如:

let
    Source = Table.FromRecords({[text="A-123"], [text="456"], [text="7-X89"]}),
    Result = Table.AddColumn(Source, "Values", each NumbersOnly([text]), Int64.Type)
in
    Result

答案 2 :(得分:1)

另一种解决方案是在每个数字上拆分值,并从结果列表中删除空白。

此结果可用作与函数Splitter.SplitTextByEachDelimiter一起使用的新分隔符列表,以再次拆分原始文本并将结果列表与最终结果组合。

说明:Splitter.SplitTextByEachDelimiter首先在列表中的第一个分隔符上分割,然后在第二个分隔符上分割,依此类推。请注意,此函数创建一个必须使用原始字符串作为参数调用的函数,因此与S.S(分隔符)(字符串)一样。

示例代码:

let
    Source = Table1,
    NumbersOnly = Table.TransformColumns(Source,{{"String", (string) => Text.Combine(Splitter.SplitTextByEachDelimiter(List.Select(Text.SplitAny(string,"0123456789"), each _ <> ""))(string))}})
in
    NumbersOnly