目标是更改现有列而不是创建新列。
在 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 |
有多种方法可以使用您的逻辑转换该列:
使用您展示的
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"
两者都会导致: