Сегодня поговорим про регулярные выражения (они же – regular expressions, или RegEx), а также как и для чего их использовать в Qlik. Стандартный функционал Qlik Sense и QlikView, к сожалению, не поддерживает этот полезный инструмент обработки данных, но есть обходные пути. В сегодняшней статье я постараюсь восполнить этот пробел и расскажу, как «подружить» RegEx с Qlik-ом (для QlikView и Qlik Sense будут свои способы).
Что такое RegEx?
Регулярные выражения – формальный язык, позволяющий оперировать строками при помощи специальных образцов (шаблонов).
А теперь просто о сложном: регулярные выражения – это строка из метасимволов, в которой зашифрованы действия над строкой. Я разделяю RegEx на две части: 1 – шаблон (зашифрованная часть строки), 2 – описание действия с использованием шаблона.
Чтобы лучше разобраться в RegEx, рассмотрим пример:
RegExReplace(“\d+”, String_IN, String_Replace)
Разберем это выражение по частям:
- \d+ — непосредственно шаблон из метасимволов, означающий любые цифры, идущие подряд в тексте,
- String_IN – строка над которой мы производим манипуляции,
- String_Replace – строка замены,
- RegExReplace() – команда указывающая действие (в данном случае — замена)
Теперь понятно, что наш пример расшифровывается так: в строке String_IN мы делаем замену цифр на строку String_Replace.
Функционал RegEx на сегодняшний момент доступен для многих языков программирования: Perl, C#, PHP, Python, R и т.д., но во многих BI он пока остается незаслуженно обделенным.
Пара полезных ссылок, чтобы разобраться с RegEx:
- Он-лайн справочник по регулярным выражениям (на английском)
- Шпаргалка по регулярным выражениям от Dave Child (в переводе, на русском)
- Конструктор регулярных выражений с подстветкой синтаксиса
- Еще один конструктор регулярных выражений на различных языках программирования
Когда необходимы RegEx?
Регулярные выражения оказываются очень полезными, когда мы имеем дело с неоднозначными или «грязными» данными.
Вспомним пример (именно вспомним, потому что такое точно было у каждого): в идеальном мире в поле «Phone» должны быть только красивые записи на вроде такой: «+7123456789», но мы там легко можем встретить и нечто подобное: «Стационарный отсутствует, звонить на +71234567890 4578». Понятно, что данные грязные, и оттуда нужно как-то вытянуть телефон, да еще сперва бы хорошо проверить, есть ли там вообще номер телефон. Я в данном случае использую RegEx, чтобы легко разобрать строку по известным шаблонам)
RegEx + Qlik
Теперь разберемся, как подружить RegEx и Qlik на примере этой задачи с вычисткой списка с телефонами. Но прежде чем приступить к настройке работы, одно замечание – сам механизм настройки для QlikView и Qlik Sense отличается! В QlikView мы решим задачу при помощи макроса VBScript, а вот в Qlik Sense уже будем использовать язык R (это, пожалуй, наименьшее из того, на что способна интеграция с ним).
Заметки на полях: Что такое VBScript на этом ресурсе никому объяснять не нужно, а вот про язык R скажу пару слов. R — язык программирования для статистической обработки данных и работы с графикой, а также свободная программная среда вычислений с открытым исходным кодом в рамках проекта GNU. R поддерживает широкий спектр статистических и численных методов и обладает хорошей расширяемостью с помощью пакетов. Пакеты представляют собой библиотеки для работы специфических функций или специальных областей применения.
RegEx в QlikView
Для QlikView мы будем использовать макросы и воспользуемся всеми любимым VBScript!
Текст VBScript (скрипт закомментировал, так что без особых комментариев):
Function RegExTest(iString, Pattern, IgnoreCase)
‘ Returns TRUE if Pattern can be matched to iString
‘ iString: string, the input string to search in
‘ Pattern: string, the regular expression pattern to search for
‘ IgnoreCase: boolean, indicates if search should be case-sensitive
set RE = New RegExp
RE.Pattern = Pattern
RE.IgnoreCase = IgnoreCase
RegExTest = RE.Test(iString)
End Function
Function RegExReplace(iString, sPattern, rPattern)
‘ Replaces any occurence of sPattern within the string iString with rPattern
‘ and returns the modified string, if no match is found the original string
‘ is returned
‘ iString: string, the input string to search and replace in
‘ sPattern: string, the pattern to search for
‘ rPattern: string, the pattern to replace the found pattern with
set RE = New RegExp
RE.Pattern = sPattern
RE.Global = True
RegExReplace = RE.Replace(iString, rPattern)
End Function
Function RegExFind(iString, Pattern, Separator, IgnoreCase)
‘ Returns a string containing the matches that were found by searching for Pattern in iString.
‘ If more than 1 match was found, the results are separated by the character(s) specified in Separator
‘ iString: string, the input string to search
‘ Pattern: string, the pattern to search for
‘ Separator: string, the character(s) to use for separating results
‘ IgnoreCase: boolean, indicates if the search should be case-sensitive
set RE = New RegExp
RE.Pattern = Pattern
RE.IgnoreCase = IgnoreCase
RE.Global = True
set Found = RE.Execute(iString)
for i = 0 To Found.Count — 1
Result = Result & Found(i).Value & Separator
next
RegExFind = left(Result, len(Result)-1)
End Function
На выходе этот скрипт выдает 3 функции:
RegExTest – проверка, соответствует ли регулярное выражение строке/части строки
RegExReplace – замена регулярного выражения на другую строку
RegExFind – выводит часть строки, соответствующую регулярному выражению
Данный скрипт можно легко дополнить любыми необходимыми вам функциями =)
RegEx в Qlik Sense
В Qlik Sense более интересная ситуация благодаря интеграции с языком R – он дает более широкие возможности для манипуляции с данными.
Шаг 0. Исходим из того, что Qlik Advanced Analytics Integration (AII) у вас настроена. В этой статье я настройку описывать не буду, на QlikCommunity есть отдельный форум по этой теме (там вообще много полезных документов и упражнений): https://community.qlik.com/community/advanced-analytics-integration/content
На самом деле, все почти и готово, дальше от нас потребуется минимум усилий =)
Шаг 1.
Немного настроек со стороны R: нам необходимо установить библиотеку – stringr. Эта библиотека должна быть установлена в R, а в Qlik Sense мы ее будем только подключать.
Шаг 2. Вот так может выглядеть команда, которая почистит наш список телефонов:
R.ScriptEval(‘
library(stringr); // подключение необходимой нам библиотеки
str_extract(Field_R, “\+[7]\d{10}”) ‘, // определяем номер как +7 и 10 цифр
В этом варианте нам доступно гораздо большее число команд, нежели для QlikView, а соответственно, и возможностей намного больше. Но есть и свой минус – этот способ сложнее, т.к. необходимо иметь дополнительные знания по синтаксису R!
Коллеги, расскажите, а вы пробовали использовать RegEx в QlikView или Qlik Sense? Для каких задач?
Свежие комментарии