我有一个数据集(机场位置代码),例如伦敦 (LHR)、巴黎 (CDG)、罗马 (FCO) 等位于每一行。
在某些行上,条目可能是 London、London、London、Paris。我计划通过清除重复项来删除它,但是在某些情况下我有真正的重复项,例如伦敦、巴黎 伦敦。我想保留伦敦的决赛,因为中间还有另一个地点。如果我们考虑机场代码,路线可能如下 -
LHR、LHR、CDG、FCO、FCO(更改为 LHR-CDG-FCO)-
LHR、LHR、CDG、CDG、CDG、LHR(更改为 LHR-CDG-LHR)我能够实现的是它刚刚返回 LHR-CDG 的不同列表。
代码出现的次数是动态的。
PowerQuery 中是否有可以返回此类逻辑的函数?
样本数据:
身份证 | 路线 | 所需结果 |
---|---|---|
1 | LHR、LHR、CDG、CDG、FCO | LHR-CDG-FCO |
2 | AMS、AMS、LHR、CDG | AMS-LHR-CDG |
3 | AMS、AMS、LHR、AMS、AMS | AMS-LHR-AMS |
4 | CGN-CGN-AMS-AMS-AMS-CDG-CDG-AMS | 中广核-AMS-CDG-AMS |
5 | 中广核-中广核-CDG-CDG-CDG | 中广核-CDG |
您可以使用
List.Accumulate
和 List.Last
来完成此操作,将此公式粘贴到新的自定义列中:
Text.Combine(
List.Transform(
List.Accumulate(
Text.SplitAny([Route], ",-") /* Will split given column on any of the listed delimiters in 2nd argument */
, {}, (state,current) =>
if List.Last(state) <> Text.Trim(current)
then List.Combine({state, {Text.Trim(current)}})
else state
),
Text.From
), "-" /* Delimiter for output column */
)
此函数执行以下操作:
List.SplitAny
List.Accumulate
中使用空列表作为基线,它会循环遍历拆分列列表,并检查列表的最后一个元素与当前(已修剪,以避免前导/尾随空格)循环值的比较情况List.Combine
Text.Combine
和设定的分隔符将 List.Accumulate
的结果组合成文本字符串虽然是高级功能,但我还是很满意!
这是使用自定义函数的替代方法。
(values as text, index as number) as text => let
array = Text.Split(values, ","),
arrayLength = List.Count(array) - 1,
same = if array{index}=array{1+index} then true else false,
compare = if array{index}=array{1+index} then List.RemoveRange(array,index,1) else array,
result = if index < arrayLength then @collapse(Text.Combine (compare,","), if same = true then index else index+1) else values
in result
该函数名为collapse。