Power Query - 仅删除连续的重复项

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

我有一个数据集(机场位置代码),例如伦敦 (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
powerbi powerquery powerbi-desktop m
2个回答
5
投票

您可以使用

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
    的结果组合成文本字符串

虽然是高级功能,但我还是很满意!


2
投票

这是使用自定义函数的替代方法。

(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。

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