List.Accumulate vs List.Zip - или нестандартная замена в тексе

#АнатомияФункций – List.Accumulate



Всем привет!

В чат принесли задачку по замене в тексте последовательности из нескольких длинных тире на слеш. Поскольку обычные тримы с реплейсами в этой ситуации не работают, пришлось поколдовать. По этому поводу вариант просто на функциях:

let

f=(x)=>[lst = Text.ToList(x),

zip = Text.Replace(Text.Combine(List.Transform(List.Select(List.Zip({lst,List.Skip(lst)}),(x)=>x<>{"—","—"}),(x)=>x{0})),"—","/")][zip],



from = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],

to = Table.TransformColumns(from,{"txt",f})

in

to


Вариант с if then else:

let

f=(x)=>[lst = Text.ToList(x),

zip = Text.Combine(List.Transform(List.Zip({lst,List.Skip(lst)}),(x)=>if x{0}<>"—" then x{0} else if x{1}="—" then "" else "/"))][zip],



from = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],

to = Table.TransformColumns(from,{"txt",f})

in

to


И вариант с аккумулятором:

let

f=(x)=>List.Accumulate(Text.ToList(x),"",(s,c)=>if c<>"—" then s&c else if Text.EndsWith(s,"/") then s else s&"/"),



from = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],

to = Table.TransformColumns(from,{"txt",f})

in

to




Ну а о том, насколько медленный аккумулятор или короче=быстрее, рассказывается, как обычно, рассказывается на Ютубе



Лайк, коммент, подписка приветствуются )))



Надеюсь, было полезно.

Всех благ!

@buchlotnik