Всем привет! Есть текст в котором встречаются ссылки на goo.gl Особенность этих ссылок, что после goo.gl/ идут 6 цифр. В предложении может быть больше 1 ссылки. Не могу придумать как вырезать ссылки именно в Power Query, в аттаче приложил пример. Буду благодарен за помощь, спасибо!
И все же непонятно - в итоге что надо получить? Эти 6 символов или всю ссылку? В каком виде, если в одном столбце их несколько? Через запятую, в нескольких столбцах, в строках?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Дмитрий Щербаков, извините, что не четко написал. В идеале через точку запятой эти 6 цифр из URL. Но впринципе устроит любой формат, я их собрать смогу. Я не понимаю как вырезать их. Спасибо Вам за помощь!
Доброе время суток Версия на регулярных выражениях.
Код
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
Привет, Алексей. Это 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 сек.
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
Доброго дня. Несколько дней назад в приемах вышла новая тема Николая Павлова про регулярные выражения и как их применять в 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"
Если я правильно понял - регулярная находится между слешами / [\w|.|-]*@\w*\.[\w|.]*(?= |$) все что находится внутри функции web.page -это текст. Разделите его до и после слешев и вставшие свою регулярку ...match(/“ & regExp & “/gi).join...
Вариант. P. S. Михаил, на мой взгляд, в шаблоне [\w|.|-]*@\w*\.[\w|.]*(?= |$) есть ошибки. Использовал более примитивный шаблон P. P. S. Сейчас тёзка подтянется, как мне лещей накидает за криворукость
Что-то в 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.
Андрей Лящук, большое спасибо. Только в силу наличия изменения в HKEY_LOCAL_MACHINE\SOFTWARE на практике почти не применимо. Кто ж туда даст что-то изменить обычному пользователю?
если мне память не изменяет, то дать права на изменение разделов или отдельных ключей реестра можно через gpedit, правда он не во всех редакциях Windows есть, но его можно установить через dism