Страницы: 1
RSS
Power Query, заменить текстовые значения по условиям символов
 
Доброго дня всем форумчанам!
Подскажите, как в PQ удалить значения внутри скобок (вместе со скобками). В более сложном случаев конце текста встречаются открывающие скобки, но без закрывающей - такие случаи могут быть только в конце текста, никак не в середине. Просто в экселе я использовал команду заменить на "пусто" следующие команды:
1. (*)
2. (*
в PQ они не работают, пожалуйста, подскажите аналог команды в PQ.
 
Оно всегда в конце строки? Если да, то проще всего оставить все что до открывающей скобки.
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Extracted Text Before Delimiter" = Table.TransformColumns(Source, {{"Столбец1", each Text.BeforeDelimiter(_, " ("), type text}})
in
    #"Extracted Text Before Delimiter"

Кнопочками это вот так:
Изменено: PooHkrd - 28.05.2019 09:25:27
Вот горшок пустой, он предмет простой...
 
PooHkrd, приветствую.
Цитата
PooHkrd написал:
Оно всегда в конце строки?
бывают случаи, что двойные скобки могут быть в середине текста. Случаи с незакрытой скобкой только в конце - это когда в программе поле ввода ограничено кол-вом допустимых вводимых значений и на закрывающую скобку не хватает места.
Исходя из этого, мне кажется, что "текст перед разделителем" не подойдет.
Изменено: Vladimir Chebykin - 28.05.2019 09:37:28
 
Тогда так:
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Столбец1", type text}}),
    #"Extracted Text Before Delimiter" = Table.TransformColumns(#"Changed Type", {{"Столбец1", each Text.BeforeDelimiter(_, " (") & Text.AfterDelimiter(_, ")"), type text}})
in
    #"Extracted Text Before Delimiter"
Вот горшок пустой, он предмет простой...
 
PooHkrd, благодарю! Опять выручили!
 
Возникла проблема: оказалось, что если в тексте встречаются скобки несколько раз, то выше предложенное решение позволяет удалить только одни скобки. PooHkrd,  или кто-нибудь еще: сможете модифицировать данное решение или предложить другое? Считаем, что скобки в тексте могут встретиться и 2, и 3, и более раз.. Файл с примером подкорректировал.
Заранее спасибо
 
Ну, тогда можно прогнать текст в цикле через данное преобразование при помощи рекурсии:
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Столбец1", type text}}),
    Text_DellAllBetweenDelimeters = (t as text, d1 as text, d2 as text) => 
        if Text.Contains(t, d1) 
            then @Text_DellAllBetweenDelimeters( Text.BeforeDelimiter( t, d1) & Text.AfterDelimiter(t, d2), d1, d2 )
            else t,
    #"Extracted Text Before Delimiter" = Table.TransformColumns(#"Changed Type", {{"Столбец1", each Text_DellAllBetweenDelimeters( _, "(", ")" ), type text}})
in
    #"Extracted Text Before Delimiter"
Изменено: PooHkrd - 28.05.2019 12:59:30
Вот горшок пустой, он предмет простой...
 
Круто, спасибо!
 
Да пожалуйста. Подозреваю что через работу со списками можно было бы и по-другому задачу решить, но обычно парсингом я не занимаюсь, а сейчас некогда копаться в справочниках.
Еще можно накопать пример использования регулярок от Анрей VG и придумать шаблон, который будет делать то же самое.
Если будет тормозить, то рекомендую использовать эту функцию через добавление нового столбца и удаление старого. Обычно на больших массивах так заметно быстрее работает
Вот горшок пустой, он предмет простой...
 
Не, не надо циклы. Вот формула для столбца:
Код
Text.Combine(
    List.RemoveMatchingItems(
        List.Alternate(
            Splitter.SplitTextByAnyDelimiter({"(", ")"})([Столбец1]),
            1,1,1),
        {"", " "}
    )
)
F1 творит чудеса
Страницы: 1
Наверх