PowerQuery 条件字符串长度基于另一列中的值

问题描述 投票:0回答:1

目标是更改现有列而不是创建新列。

在 Power BI 中,我尝试根据现有列上的产品名称进行条件字符串长度清理。

这是尝试根据自定义架构类型清理软件代码版本。理想情况下,我希望通过多个 if 嵌套 if 语句一步完成此操作。

业务逻辑
如果是 Apple,请保留前 5 个字符
如果是三星,请保留前 6 个字符
如果是诺基亚,请保留前 5 个字符
否则返回现有标签

产品 标签
苹果 12.23.244.12
三星 001.23.34-21
诺基亚 4-213.2
苹果 11.22.002.12
诺基亚 4-213.2
诺基亚 4-213.2
三星 002.22.34-67
随机 修订版-22-91.23

我当前失败的代码如下所示:

= table.TransformColumns(Table.TransformRows(#"prevstep",
   (r) => Record.TransformFields( r, {
   {if r[Product] = "Apple" then Text.Start(_,5)
    else if r[Product] = "Samsung" then Text.Start(_,6)
    else if r[Product] = "Nokia" then Text.Start(_,5)
    else _}
   }))

所需输出

产品 标签
苹果 12.23
三星 001.23
诺基亚 4-213
苹果 11.22
诺基亚 4-213
诺基亚 4-213
三星 002.22
随机 修订版-22-91.23
powerbi dax powerquery powerbi-desktop
1个回答
0
投票

有多种方法可以使用您的逻辑转换该列:

使用您展示的

TransformRows
方法:

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("bY47CoAwEETvsrUJySQoll7AQsuQIqCI+AXR87sJKBa2783OrHNU7fvcU0YaEkbCWqlBPnPUhuU414GVUjo6YwV0UvU2jYFFBHyT2NvDWUil8PT8hf/Ydw+xg/fyIqkmrN22sGn6SwCijP+Q9zc=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Product = _t, Label = _t]),

    xformProducts={"Apple","Samsung","Nokia"},
    xformLength = {5,6,5},
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Product", type text}, {"Label", type text}}),

    xform = Table.TransformRows(#"Changed Type", (r)=> Record.TransformFields(r,{"Label", 
        each try Text.Start(_, xformLength{List.PositionOf(xformProducts,r[Product])}) otherwise _})),
    
    #"Converted to Table" = Table.FromList(xform, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Expanded Column1" = Table.ExpandRecordColumn(#"Converted to Table", "Column1", {"Product", "Label"}, {"Product", "Label"})
    
in
    #"Expanded Column1"

您还可以使用

ReplaceValue
方法:

let 
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("bY47CoAwEETvsrUJySQoll7AQsuQIqCI+AXR87sJKBa2783OrHNU7fvcU0YaEkbCWqlBPnPUhuU414GVUjo6YwV0UvU2jYFFBHyT2NvDWUil8PT8hf/Ydw+xg/fyIqkmrN22sGn6SwCijP+Q9zc=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Product = _t, Label = _t]),

    xformProducts={"Apple","Samsung","Nokia"},
    xformLength = {5,6,5},
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Product", type text}, {"Label", type text}}),
    #"Replace Labels" = Table.ReplaceValue(
        #"Changed Type",
        each [Product],
        each [Label],
        (x,y,z)=> try Text.Start(x, xformLength{List.PositionOf(xformProducts,y)}) otherwise z,
        {"Label"})

in 
    #"Replace Labels"

两者都会导致:

© www.soinside.com 2019 - 2024. All rights reserved.