Подниму тему, может кому пригодится. Я в итоге решил эту задачу сам, способ довольно простой. Нюанс разве что в том, чтобы расположить в словаре "разделителей" AB раньше, чем B, чтоб AB отрезалось до B. Задачи сохранить порядок результата не было, главное было разделить. Цифра после первых двух букв в моём случае мне не нужна была.
Принцип алгоритма таков - проверяем первое вхождение подстроки в искомом тексте. Если не найдено, оставляем строку как есть. Если совпадение найдено - закидываем в генерируемый список найденное совпадение, и тут же отрезаем из искомого текста этот "кусочек" с помощью text.positionof и text.length.
На выходе список найденных значений, скомбайненный через запятую.
Принцип алгоритма таков - проверяем первое вхождение подстроки в искомом тексте. Если не найдено, оставляем строку как есть. Если совпадение найдено - закидываем в генерируемый список найденное совпадение, и тут же отрезаем из искомого текста этот "кусочек" с помощью text.positionof и text.length.
На выходе список найденных значений, скомбайненный через запятую.
| Код |
|---|
let
dict=List.Buffer({"SW","FW","R1","R2","R3","R4","R5","RW1","RW2","RW3","RW4","RW5","RW6","RW7","RW8","RW9","RW10","AD","AB","BB","DD","B2","D2","B","D","CIR","AIR"}),
src=Excel.CurrentWorkbook(){[Name="data"]}[Content],
split_text=Table.AddColumn(src,"split",func_split),
func_split=(x)=>[
count=List.Count(dict),
tl=Text.Length(x[Column1]),
a=List.Generate(
()=>[i=0,txt=x[Column1]],
(y)=>y[i]<count,
(y)=>[
txt=if Text.PositionOf(y[txt],dict{y[i]})=-1 then y[txt] else Text.RemoveRange(y[txt],Text.PositionOf(y[txt],dict{y[i]}),Text.Length(dict{y[i]})),
i=y[i]+1],
(y)=>if Text.PositionOf(y[txt],dict{y[i]})>-1 then dict{y[i]} else null
),
b=Text.Combine(List.Select(a,(x)=>x<>null),",")
][b]
in
split_text |
Изменено: - 13.04.2026 19:49:01