Страницы: 1 2 След.
RSS
PQ: Вырезать ссылку из текстового поля
 
Всем привет!
Есть текст в котором встречаются ссылки на goo.gl Особенность этих ссылок, что после goo.gl/ идут 6 цифр. В предложении может быть больше 1 ссылки.
Не могу придумать как вырезать ссылки именно в Power Query, в аттаче приложил пример. Буду благодарен за помощь, спасибо!
 
И все же непонятно - в итоге что надо получить? Эти 6 символов или всю ссылку? В каком виде, если в одном столбце их несколько? Через запятую, в нескольких столбцах, в строках?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий Щербаков, извините, что не четко написал. В идеале через точку запятой эти 6 цифр из URL. Но впринципе устроит любой формат, я их собрать смогу. Я не понимаю как вырезать их. Спасибо Вам за помощь!  
 
Самый простой вариант, без хардкора:
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Table2"]}[Content],
    l1 = Источник[Текст],
    Output = Table.AddColumn(Источник, "Output text", each Text.Split([Текст], "https://goo.")),
    #"Развернутый элемент Output text" = Table.ExpandListColumn(Output, "Output text"),
    #"Добавлен пользовательский объект" = Table.AddColumn(#"Развернутый элемент Output text", "Результат", each if Text.StartsWith([Output text],"gl/") then Text.Middle([Output text],3,6) else ""),
    #"Удаленные столбцы" = Table.RemoveColumns(#"Добавлен пользовательский объект",{"Output text"})
in
    #"Удаленные столбцы"

Знаю, что можно очень короче сделать, но башка чего-то не варит. Вокруг да около хожу :)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Доброе время суток
Версия на регулярных выражениях.
Код
let
    get6symbols = (data) =>
        Web.Page("<script>var d = '" & data & "', r = ''; try {r = d.match(/\/[0-9a-z]{6}(?= |$)/gi).join(';').replace(/\//g, '');} catch (e) {}; document.write(r);</script>"){0}[Data]{0}[Children]{1}[Children]{0}[Text],
    demo = get6symbols("Привет пока https://goo.gl/PJBwF8 слово слово разное кол-во слов https://goo.gl/M8rUz1")
in
    demo
 
Цитата
Самый простой вариант
let in первый раз слышу о таком. Как его применять?
Где почитать?
 
Цитата
Александр Моторин написал:
Где почитать?
Тут и тут.
 
Андрей VG, бомба как всегда:) Спасибо огромное, заодно научился вызывать функции:) Благодарю
Дмитрий Щербаков, спасибо огромное за помощь!  
 
Андрей VG, подскажите пожалуйста, а что нужно изменить в функции, чтобы если ссылок не было, то было бы просто пусто, а то сейчас возвращает error
 
Андрей VG, объясните тёмному это на каком языке скрипт? Куда хоть копать? Давно интересуюсь применением регулярок в PQ. А тут такая лепота.
Вот горшок пустой, он предмет простой...
 
Vsevolod, нужно вызов функции облечь в конструкцию
Код
= try function() otherwise null
Вот горшок пустой, он предмет простой...
 
PooHkrd, первый раз работаю с функцией, не могу понять, я вот так вызываю функцию
Код
    #"goo.gl links" = Table.AddColumn(#"Added Index", "goo.gl", each #"Вырузание ссылок"([message]))

Какой будет синтаксис? Благодарю за помощь!

 
Попробуйте так:
Код
#"goo.gl links" = Table.AddColumn(#"Added Index", "goo.gl", each try #"Вырузание ссылок"([message]) otherwise null)
Вот горшок пустой, он предмет простой...
 
PooHkrd, все понял! Спасибо огромное!  
 
Цитата
PooHkrd написал:
это на каком языке скрипт
Привет, Алексей.
Это javascript. Сергей Лосев в группе, до которой вы так и не добрались выкладывал такое "пристёгивание" регулярок в Power Query.
Если будете использовать, то следует учитывать такой момент, что определённые символы для передачи строки в js код должны быть преобразованы. Ну, и лучше соединять данные столбца для регулярок в одну строку через разделитель, а потом через Text.Split, Table.AddIndexColumn и  Table.Join соединять результат с исходной таблицей. Будет раз в 10 быстрее. На таблице Всеволода, размноженной до 100000 строк, такой подход раз в 10 быстрее.
Код
let
    get6symbols = (data) =>
        Web.Page("<script>var d = '" & data & "', r = d.split('|'), c = r.length; for (var i = 0; i < c; i += 1) {try {r[i] = r[i].match(/\/[0-9a-z]{6}(?= |$)/gi).join(';').replace(/\//g, '');} catch (e) {r[i] = '';};};document.write(r.join('|'));</script>"){0}[Data]{0}[Children]{1}[Children]{0}[Text],
    Source = Excel.CurrentWorkbook(){[Name="Table2"]}[Content],
    data = try Text.Combine(Source[Текст], "|") otherwise null,
    convert = get6symbols(data),
    resultCol = try Table.FromColumns({Text.Split(convert, "|")}, {"test"}) otherwise null,
    resultIdx = Table.AddIndexColumn(resultCol, "idx"),
    sourceIdx = Table.AddIndexColumn(Source, "idx"),
    joined = Table.Join(sourceIdx, {"idx"}, resultIdx, {"idx"}),
    #"Removed Columns" = Table.RemoveColumns(joined,{"idx"})
in
    #"Removed Columns"

P. S. Кстати, это решение для той задачи с преобразованием текста, записанного в "верблюжем" стиле, в текст с пробелами самое быстрое. Порядка 300000 повторений той фразы обрабатывался за 8 секунд. Лучшее решение модифицированным способом Imkef за 45 сек.
 
Андрей VG, очень круто. Спасибо огромное за такой исчерпывающий ответ. Топик в закладки навечно. Думаю неоднократно здесь такое еще всплывет.
Изменено: PooHkrd - 02.07.2018 11:31:29
Вот горшок пустой, он предмет простой...
 
Ух, какие шедевры!.. Спасибо!.. а я только решила разбираться, искать, начинать с нуля - RegEx in Power BI and Power Query in Excel with Java Script
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Доброго дня. Несколько дней назад в приемах вышла новая тема Николая Павлова про регулярные выражения и как их применять в Power Query. В запросах темы при вызове функции передаются три параметра - текст, регулярка, разделитель.
В запросе из этой темы хотел также при вызове функции передавать несколько параметров. Текст и так заложено передавать, разделитель добавить смог, а вот регулярное выражение не в какую. Пробовал наобум, так как отследить, што происходит в js-скрипте, не могу и не знаю  
Подскажите, как все таки передавать в функцию регулярное выражение параметром

в приложенном коде регулярка внутри js-скрипта, а хотел бы так - fn( data , "[\w|.|-]*@\w*\.[\w|.]*" ,  "|" )
Код
// Извлекаем email_2
let fn = (txt as text, delim as text ) =>
     
      Web.Page("<script>
        var delim = '" & delim & "'; var d = '" & txt & "', r = d.split('|'), 
        c = r.length; for (var i = 0; i < c; i += 1) {try {r[i] = 
        r[i].match(/[\w|.|-]*@\w*\.[\w|.]*(?= |$)/gi).join(delim).replace(/\//g, '');} 
      catch (e) {r[i] = '';};};document.write(r.join('|'));</script>"){0}[Data]{0}[Children]{1}[Children]{0}[Text],
  


    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    data = try Text.Combine(Source[MyText], "|") otherwise null,
    // convert = fn(data, "|"),
  convert = fn(data, " ; "),
  resultCol = try Table.FromColumns({Text.Split(convert, "|")}, {"test"}) otherwise null,
    resultIdx = Table.AddIndexColumn(resultCol, "idx"),
    sourceIdx = Table.AddIndexColumn(Source, "idx"),
    joined = Table.Join(sourceIdx, {"idx"}, resultIdx, {"idx"}),
    #"Removed Columns" = Table.RemoveColumns(joined,{"idx"})
in
    #"Removed Columns"
Изменено: Михаил Л - 25.07.2020 11:23:17
 
Если я правильно понял - регулярная находится между слешами / [\w|.|-]*@\w*\.[\w|.]*(?= |$)
все что находится внутри функции web.page -это текст. Разделите его до и после слешев и вставшие свою регулярку
...match(/“ & regExp & “/gi).join...
 
Вариант.
P. S. Михаил, на мой взгляд, в шаблоне [\w|.|-]*@\w*\.[\w|.]*(?= |$) есть ошибки. Использовал более примитивный шаблон :)
P. P. S. Сейчас тёзка подтянется, как мне лещей накидает за криворукость :)
Изменено: Андрей VG - 25.07.2020 11:43:41
 
DrillPipe,  спасибо. Попробую ваш вариант
Андрей VG, спасибо. Посмотрю подробнее, попробую разобрать
             
 
gi - это то же часть регулярного выражения. i-флаг не чувствительности к регистру, а g вроде как массив совпадений возращает
Изменено: DrillPipe - 25.07.2020 12:11:36
 
Цитата
DrillPipe написал:
регулярная находится между слешами / [\w|.|-]*@\w*\.[\w|.]*(?= |$)
Изменяемая часть, как я понимаю, эта -    [\w|.|-]*@\w*\.[\w|.]*    .  Именно эту часть я хотел передавать в параметре.
Позже попробую варианты
 
Цитата
DrillPipe написал:
..match(/“ & regExp & “
Сработало!
Код
let fn = (txt as text, regExp as text, delim as text ) =>
     
      Web.Page("<script>
        var delim = '" & delim & "';var regExp = '" & regExp & "'; var d = '" & txt & "', r = d.split('|'), 
        c = r.length; for (var i = 0; i < c; i += 1) {try {r[i] = 
        r[i].match(/"®Exp&"(?= |$)/gi).join(delim).replace(/\//g, '');} 
      catch (e) {r[i] = '';};};document.write(r.join('|'));</script>"){0}[Data]{0}[Children]{1}[Children]{0}[Text],
    getJsSafeText = (pqText) => List.Accumulate({{"\", "\\"}, {"'", "\'"},{"""", " \\""\\ "},{", ", " \\, \\ "},
    {"#(tab)", "\t"}, {"#(lf)", "\n"}, {"#(cr)", "\r"}}, pqText, (acc, pair) => Text.Replace(acc, pair{0}, pair{1})),
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    data = try Text.Combine(Source[MyText], "|") otherwise null,
    convert = fn(getJsSafeText(data), "[\w|.|-]*@\w*\.[\w|.]*", "; "),
    resultCol = try Table.FromColumns({Text.Split(convert, "|")}, {"test"}) otherwise null,
    resultIdx = Table.AddIndexColumn(resultCol, "idx"),
    sourceIdx = Table.AddIndexColumn(Source, "idx"),
    joined = Table.Join(sourceIdx, {"idx"}, resultIdx, {"idx"}),
    #"Removed Columns" = Table.RemoveColumns(joined,{"idx"})
in
    #"Removed Columns"
 
Цитата
Андрей VG написал:
Сейчас тёзка подтянется, как мне лещей накидает
Это хто такой? Oo ниче не знаю...  :)  
Код
Table.FromRecords(
    Json.Document(
        Web.Page(
            "<script>
                var re=/(([^<>()\[\]\\.,;:\s@""]+(\.[^<>()\[\]\\.,;:\s@""]+)*)|("".+""))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))/ig; 
                var json="& 
                    Text.FromBinary(
                        Json.FromValue(Excel.CurrentWorkbook(){[Name = "Таблица1"]}[Content])
                    )&
                ";
                document.write('\
                <table><tr><th>a\
                       <tr><td>'+
                           JSON.stringify(
                               json.map(
                                   function(a){
                                       try{
                                           a.a=a.MyText.match(re).join(', ')
                                       }catch(e){
                                           a.a=null
                                       }
                                       return a
                                   }
                               )
                           )+
                '</table>')
            </script>"
        ){0}[Data]{0}[a]
    )
)
 
Андрей Лящук, спасибо за вариант :)  
 
Цитата
Андрей Лящук написал:
Oo ниче не знаю...
Что-то в Excel не работает. Array.prototype.map - как бы javascript 5, а в Excel работает, увы, только 3 :(
Updated
Попробовал в Power BI Desktop
Код
let
    Source = "
<script>
var result;
var text = '1|2|3';
var items = text.split('|');
try {
    result = items.map(function (item) {return 'id' + item;}).join(';');
} catch (err) {
    result = err.message;
};
document.write(result);
</script>
",
    web = Web.Page(Source){0}[Data]{0}[Children]{1}[Children]{0}[Text]
in
    web

Ну, и получил
Цитата
Объект не поддерживает свойство или метод "map"
Андрей, как включили js 5? Откройте тайну, пожалуйста! Уж, больно заманчиво JSON использовать, а он тоже только с 5.
Изменено: Андрей VG - 26.07.2020 00:28:58
 
Андрей VG, задал режим совместимости IE=11 с помощью ключа реестра FEATURE_BROWSER_EMULATION
Изменено: Андрей Лящук - 26.07.2020 06:10:51
 
Андрей Лящук, большое спасибо. Только в силу наличия изменения в HKEY_LOCAL_MACHINE\SOFTWARE на практике почти не применимо. Кто ж туда даст что-то изменить обычному пользователю?
 
ну в принципе, должно быть достаточно раздела
Код
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION
если мне память не изменяет, то дать права на изменение разделов или отдельных ключей реестра можно через gpedit, правда он не во всех редакциях Windows есть, но его можно установить через dism
Страницы: 1 2 След.
Наверх