繁体   English   中英

从十进制幂查询中拆分非数字

[英]split non digit from decimal power query

使用幂查询,我们可以将一列拆分为非数字到数字的数据,这在您有一个值(例如Lead 10拆分为Lead10时效果很好)但是,如果数字是小数,无论如何都可以以相同的方式拆分例如Lead 20.5 采用分体式非数字到数字分割这是Lead 20. 5

我有以下示例数据,我希望按如下方式拆分:

Lead 20.5 --> `Lead` `20.5`
No Data --> `null`
Arsenic 10 --> `Arsenic` `10`
Gold 50.55 --> `Gold` `50.55`
1,4-Dioxane 21 --> `1,4-Dioxane` `21`

以前我用最右边的“”分割但是这将无数据分割成单独的词。

关于如何实现这一目标的任何想法都会很棒。

更新 1:问题 1,4-二恶烷在此处输入图片说明

代码:

    let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Column1", type text}}),
    #"Split Column by Character Transition" = Table.SplitColumn(#"Changed Type", "Column1", 
        Splitter.SplitTextByCharacterTransition((c) => not List.Contains({"0".."9","."}, c), {"0".."9","."}), {"Column1.1", "Column1.2"})

in
     #"Split Column by Character Transition"

如何做到这一点取决于您的数据。

编辑
用化学名称中的数字说明额外的数据样本

算法

  • 测试最后一个字
    • 如果最后一个单词不是数字,则用 NBSP 替换空格
    • 然后在最右边的空间拆分。

如果最后一个单词不是空格,我将使用自定义函数来检查最后一个单词并修改字符串

自定义功能M 代码:
作为空白查询输入并重命名: fnConvString
编辑以改进计算

//Rename this query "fnConvString"
(string as text) =>
let 
   lastWord = Text.AfterDelimiter(string," ",{0,RelativePosition.FromEnd}),
   lastIsNumber = try Value.Type(Number.FromText(lastWord)) = type number otherwise false,
   replSpace = if lastIsNumber = false then Text.Replace(string," ",Character.FromNumber(160)) else string
in 
   replSpace

主代码
编辑以简化代码,没有添加列

let
    Source = Excel.CurrentWorkbook(){[Name="Table29"]}[Content],
    addNBSP = Table.TransformColumns(Source,{"Column1", each fnConvString(_)}),
    #"Split Column by Delimiter" = Table.SplitColumn(addNBSP, "Column1", 
        Splitter.SplitTextByEachDelimiter({" "}, QuoteStyle.Csv, true), {"Column1.1", "Column1.2"}),
    #"Changed Type" = Table.TransformColumnTypes(
        #"Split Column by Delimiter",{{"Column1.1", type text}, {"Column1.2", type number}})
in
    #"Changed Type"

在此处输入图片说明

没有自定义功能的编辑

如果您不想使用自定义函数,您可以将其作为Transform Operation合并到主代码中:

无自定义功能的M代码

let
    Source = Excel.CurrentWorkbook(){[Name="Table29"]}[Content],
    
    addNBSP = Table.TransformColumns(Source,{"Column1", each 
        let 
            lastWord = Text.AfterDelimiter(_," ",{0,RelativePosition.FromEnd}),
            lastIsNumber = try Value.Type(Number.FromText(lastWord)) = type number otherwise false,
            replSpace = if lastIsNumber = false then Text.Replace(_," ",Character.FromNumber(160)) else _
        in 
            replSpace
    }),

    #"Split Column by Delimiter" = Table.SplitColumn(addNBSP, "Column1", 
        Splitter.SplitTextByEachDelimiter({" "}, QuoteStyle.Csv, true), {"Column1.1", "Column1.2"}),
    #"Changed Type" = Table.TransformColumnTypes(
        #"Split Column by Delimiter",{{"Column1.1", type text}, {"Column1.2", type number}})
in
    #"Changed Type"

在 powerquery 中,根据示例数据,您似乎可以在空格字符上进行拆分。

右键单击列 .. 拆分列 .. 按分隔符 ... 分隔符:空格 ... 拆分:最左边的分隔符

let  Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Split Column by Delimiter" = Table.SplitColumn(Source, "Column1", Splitter.SplitTextByEachDelimiter({" "}, QuoteStyle.Csv, false), {"Column1.1", "Column1.2"})
in  #"Split Column by Delimiter"

如果数据不喜欢这种方法,你可以从 alpha 解析数字

添加带有公式的自定义列

= Text.Remove([Column1],{"0".."9","."})

获取纯文本部分,并添加带有公式的第二个自定义列

=try Text.Remove([Column1],Text.ToList(Text.Remove([Column1],{"0".."9","."}))) otherwise null

得到数字部分

示例完整代码

let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Added Custom" = Table.AddColumn(Source, "Text", each Text.Remove([Column1],{"0".."9","."})),
#"Added Custom1" = Table.AddColumn(#"Added Custom", "Numeric", each try Text.Remove([Column1],Text.ToList(Text.Remove([Column1],{"0".."9","."}))) otherwise null)
in  #"Added Custom1"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM