Power BI:按字符串从其他列拆分列
Power BI: Split Column by String from other column
情况:
我有一列包含需要提取的信息。以下是一些示例内容:
行
内容
1
CompanyName1 OrderNumber1 SomeUnimportantStuf1
2
CompanyName2 CompanySurname2 OrderNumber2 SomeUnimportantStuff2
3
CompanyName3 CompanySurname3 CompanyAddition3 OrderNumber_ABC3 SomeUnimportantStuff3 SomeMoreUnimportantStuff3
所以基本上是公司名称(包含从 0 到 3 spaces)、订单号和末尾的一些不必要的信息。
我需要提取 OrderNumber。问题:
- 公司名称从一个词到三个词不等
- 没有像逗号这样的唯一分隔符
- OrderNumber 并不总是相同的长度,有时会有像“_v3”甚至更多的后缀(但它没有 space - 所以基本上它总是每个单元格中最长的单词)
到目前为止我成功完成的事情:
- 提取新列“CompanyName”
中的CompanyName
这就是我卡住的地方。据我了解,最简单的方法是:
- 拆分列“Content”由“CompanyName”中的分隔符
由于 OrderNumber 本身没有 space,我可以再次拆分列并让 OrderNumber 单独存在。
另一个想法是在“内容”列中搜索最长的单词并提取它。但我也找不到任何解决方案。
有没有人可以给我一个有用的提示?
这将 return 字符串中最长的单词:
- 拆分字符串
- 获取每个拆分的长度
- 获取最大长度
- 匹配最大长度到位置
- return那个位置的单词
let
Source = Excel.CurrentWorkbook(){[Name="Table3"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Content", type text}}),
#"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each
Text.Split([Content]," "){
List.PositionOf(
List.Transform(
Text.Split([Content]," "),
each Text.Length(_)),
List.Max(
List.Transform(
Text.Split([Content]," "),
each Text.Length(_))))})
in
#"Added Custom"
编辑:重写 M 代码以更好地显示算法
不知道效率高还是低,但是比较容易理解
let
Source = Excel.CurrentWorkbook(){[Name="Table3"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Content", type text}}),
#"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each
let
wordList = Text.Split([Content]," "),
lengthList = List.Transform(wordList, each Text.Length(_)),
lengthLongestWord = List.Max(lengthList),
positionLongestWord = List.PositionOf(lengthList,lengthLongestWord),
longestWord = wordList{positionLongestWord}
in
longestWord)
in
#"Added Custom"
情况:
我有一列包含需要提取的信息。以下是一些示例内容:
行 | 内容 |
---|---|
1 | CompanyName1 OrderNumber1 SomeUnimportantStuf1 |
2 | CompanyName2 CompanySurname2 OrderNumber2 SomeUnimportantStuff2 |
3 | CompanyName3 CompanySurname3 CompanyAddition3 OrderNumber_ABC3 SomeUnimportantStuff3 SomeMoreUnimportantStuff3 |
所以基本上是公司名称(包含从 0 到 3 spaces)、订单号和末尾的一些不必要的信息。
我需要提取 OrderNumber。问题:
- 公司名称从一个词到三个词不等
- 没有像逗号这样的唯一分隔符
- OrderNumber 并不总是相同的长度,有时会有像“_v3”甚至更多的后缀(但它没有 space - 所以基本上它总是每个单元格中最长的单词)
到目前为止我成功完成的事情:
- 提取新列“CompanyName” 中的CompanyName
这就是我卡住的地方。据我了解,最简单的方法是:
- 拆分列“Content”由“CompanyName”中的分隔符 由于 OrderNumber 本身没有 space,我可以再次拆分列并让 OrderNumber 单独存在。
另一个想法是在“内容”列中搜索最长的单词并提取它。但我也找不到任何解决方案。
有没有人可以给我一个有用的提示?
这将 return 字符串中最长的单词:
- 拆分字符串
- 获取每个拆分的长度
- 获取最大长度
- 匹配最大长度到位置
- return那个位置的单词
let
Source = Excel.CurrentWorkbook(){[Name="Table3"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Content", type text}}),
#"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each
Text.Split([Content]," "){
List.PositionOf(
List.Transform(
Text.Split([Content]," "),
each Text.Length(_)),
List.Max(
List.Transform(
Text.Split([Content]," "),
each Text.Length(_))))})
in
#"Added Custom"
编辑:重写 M 代码以更好地显示算法
不知道效率高还是低,但是比较容易理解
let
Source = Excel.CurrentWorkbook(){[Name="Table3"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Content", type text}}),
#"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each
let
wordList = Text.Split([Content]," "),
lengthList = List.Transform(wordList, each Text.Length(_)),
lengthLongestWord = List.Max(lengthList),
positionLongestWord = List.PositionOf(lengthList,lengthLongestWord),
longestWord = wordList{positionLongestWord}
in
longestWord)
in
#"Added Custom"