Страницы: 1
RSS
PQ и разделение текста по набору разделителей
 
Здравствуйте.
Имеется колонка с текстом. Требуется его разделить по разделителям. Точнее даже сказать - "разрезать" в соответствии с совпадениями по разделителям. То есть в классическом понимании "разделить" - это некий символ, по которому делится текст. Мне же надо оставить сам текст разделителя. В примере есть образец "как надо". Каждый из "разделителей" может попадаться в тексте только один раз, но комбинации могут быть любыми. Я в примере привел не все возможные комбинации. Самая сложная проблема - это разделить "abb" на "ab" и "b". Я не пойму как обыграть этот момент, чтоб одиночная буква "b" не разделила "ab", а оставила "ab" слитно.
Я решил эту задачу с помощью регулярных выражений. Способ достаточно простой (мало кода), но безумно ресурсозатратный. На реальных данных таблица пересчитывается 15 минут. Прикладывать его сюда смысла не вижу. Прошу помощи у умных - как решить эту задачу без регулярок, цель - ускорить выполнение запроса.
 
витиевато, но "бегает".
сплиттер
Пришелец-прораб.
 
AlienSx, добрый вечер! )
Спасибо за решение, я попробовала, но у меня ничего не получилось ((
Ma_Ri ≠ Мария
 
Добрый вечер, Ma_Ri. А какую идею пытались реализовать?
Пришелец-прораб.
 
AlienSx, приветствую Вас!
Цитата
AlienSx, написал:
А какую идею пытались реализовать?
Так как мы пытаемся разбить текстовую строку по нескольким разделителям, соблюдая правило, что сами разделители остаются (не удаляются), то на ум приходят несколько сплиттеров, и наиболее подходящий в данной ситуации Splitter.SplitTextByPositions. С ним я и резвилась. Но как и сказала, безуспешно.
Мне конечно стыдно эти эксперименты выносить на Ваш экспертный суд. Не пугайтесь и не ругайте меня, я и правда не знала, что и как делать...
Рекурсия - для меня сложно для понимания.
Скрытый текст
Ma_Ri ≠ Мария
 
Цитата
Ma_Ri написал:
и наиболее подходящий в данной ситуации Splitter.SplitTextByPositions
а я вот в этом не уверен, хотя и сам с ним "порезвился". Закончил это дело вопросом: "Куда ты, Splitter.SplitTextByPositions тропинка, меня завела?"  :D
Цитата
Ma_Ri написал:
Рекурсия - для меня сложно для понимания.
да я и сам ее боюсь  :) Здесь и без рекурсии можно обойтись - List.Accumulate и List.Generate всегда к Вашим услугам! Только с выбором сплиттера я бы подумал (есть обычный ByDelimiter или же Text.Before/After).
Пришелец-прораб.
 
Добрый день! )
Цитата
AlienSx, написал: без рекурсии можно обойтись - List.Accumulate и List.Generate всегда к Вашим услугам!
Прям как я люблю ))  Спасибо!  ;)  
Ma_Ri ≠ Мария
 
Подниму тему, может кому пригодится. Я в итоге решил эту задачу сам, способ довольно простой. Нюанс разве что в том, чтобы расположить в словаре "разделителей" AB раньше, чем B, чтоб AB отрезалось до B. Задачи сохранить порядок результата не было, главное было разделить. Цифра после первых двух букв в моём случае мне не нужна была.
Принцип алгоритма таков - проверяем первое вхождение подстроки в искомом тексте. Если не найдено, оставляем строку как есть. Если совпадение найдено - закидываем в генерируемый список найденное совпадение, и тут же отрезаем из искомого текста этот "кусочек" с помощью 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
Изменено: Andrew Rubanov - 13.04.2026 19:49:01
Страницы: 1
Читают тему
Наверх