Страницы: 1
RSS
Удалить теги в PQ, удалить теги с текста силами PowerQuery
 
Здравствуйте, есть текст с тегами и от этих самых тегов его нужно почистить. В Excel все легко делается заменой, <*> на пусто.  А в Power Query как это реализовать?
 
Можно так:
Код
let
    fnDeleteAllBetweenDelimiters = ( t, del_1, del_2 ) => 
        [a = Text.BeforeDelimiter( t, del_1 ) & Text.AfterDelimiter( t, del_2 ),
         b = if a = t then a else @fnDeleteAllBetweenDelimiters( a, del_1, del_2 )][b],
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    AddedCustom = Table.AddColumn(Source, "New", each fnDeleteAllBetweenDelimiters( [meaning], "<", ">" ))
in
    AddedCustom
Вот горшок пустой, он предмет простой...
 
PooHkrd, спасибо, почти то что нужно. Если тег ошибочно не закрыт, или знак </> то обрезает, можно это как то добавить?
Изменено: Oleksiy Babenko - 22.10.2019 12:53:16
 
Oleksiy Babenko, дайте в примере конкретные возможные ситуации, и как должен выглядеть результат. Тогда покумекаю.
Вот горшок пустой, он предмет простой...
 
С запросом все ок когда есть начало "<" и конец ">", но бывают случаи когда тег ошибочно не закрыт, есть или "<" или ">". Пример в файле.
 
С условием выхода из цикла перемудрил. Вот так будет работать корректно:
Код
let
    fnDeleteAllBetweenDelimiters = ( t, del_1, del_2 ) => 
        if Text.Contains( t, del_1 ) and Text.Contains( t, del_2 ) 
            then @fnDeleteAllBetweenDelimiters( Text.BeforeDelimiter( t, del_1 ) & Text.AfterDelimiter( t, del_2 ), del_1, del_2 ) 
            else t,
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    AddedCustom = Table.AddColumn(Source, "New", each fnDeleteAllBetweenDelimiters( [meaning], "<", ">" ))
in
    AddedCustom

Но это тоже не панацея, если, скажем, в одной строке будут пропущены у двух разных тегов разные же ограничители, то такая функция тоже не сработает. Чтобы любые косяки устранить это либо RegExp'ом надо шерудить или посимвольно каждую строку перебирать в поисках открывающих и закрывающих символов.
Изменено: PooHkrd - 22.10.2019 17:43:23
Вот горшок пустой, он предмет простой...
 
PooHkrd, это уже получше)), сенкс.
 
Oleksiy Babenko, вот еще лучше. Практически идеал:
Код
let
    fnDeleteAllBetweenDelimiters = ( t, del_1, del_2 ) =>
        [text = Table.FromColumns({Text.ToList( t )}),
         AddedCustom1 = Table.AddColumn( text, "del1", each if Text.Contains([Column1], del_1) or Text.Contains([Column1], del_2) then [Column1] else null),
         DuplicatedColumn = Table.DuplicateColumn(AddedCustom1, "del1", "del2"),
         FilledDown = Table.FillDown(DuplicatedColumn,{"del1"}),
         FilledUp = Table.FillUp(FilledDown,{"del2"}),
         FilteredRows = Table.SelectRows(FilledUp, each not ([del1] = del_1 and [del2] = del_2)),
         Custom1 = Text.Replace( Text.Combine( FilteredRows[Column1] ), del_1 & del_2, "" )][Custom1],
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    AddedCustom2 = Table.AddColumn(Source, "New2", each fnDeleteAllBetweenDelimiters( [meaning], "<", ">" ))
in
    AddedCustom2

Немножко через одно место решение, зато отлично работает и без циклов обошлось.
Изменено: PooHkrd - 22.10.2019 18:22:17
Вот горшок пустой, он предмет простой...
 
Спасибо, сильно помог
Страницы: 1
Наверх