Я попытаюсь сделать это в два этапа.
Во-первых, давайте удалим все, что не является числом или разделителем.Мы можем создать пользовательский столбец, чтобы сделать это с помощью этой формулы (при условии, что ваш начальный столбец называется Raw
):
Text.Remove([Raw], List.Transform({33..43,60..255}, each Character.FromNumber(_)))
При этом используется нумерация Windows-1252 , но выможно просто написать большой список символов для удаления с помощью функции Text.Remove
.
Этот пользовательский столбец теперь выглядит следующим образом:
Custom
123456; 12341
123456 12341
2017 12341
123456/12341
/
ОтсюдаПлан состоит в том, чтобы разделить его, используя каждый разделитель, и отфильтровать слишком короткие строки.
Функция Text.SplitAny
позволяет указать несколько разделителей.Например, формула Text.SplitAny("1;23 4.5-6/ 7:8,9", " ,-./:;")
вернет {"1","23","4","5","6","","7","8","9"}
.
Как только у нас будет список подстрок, мы можем отфильтровать те, которые нам не нужны, с помощью List.Select
, а затемобъединить их из списка подстрок в одну строку, используя Text.Combine
.
Собрав все это вместе, мы получим следующую формулу
Text.Combine(List.Select(Text.SplitAny([Custom], " ,-./:;"), each Text.Length(_) > 4), ";")
Вы можете разбить еевсе в один шаг, если вы предпочитаете:
= Table.AddColumn(#"Previous Step", "Clean",
each Text.Combine(
List.Select(
Text.SplitAny(
Text.Remove(
[Raw],
List.Transform(
{33..43,60..255},
each Character.FromNumber(_)
)
),
" ,-./:;"
),
each Text.Length(_) > 4),
";"
)
)