Сегодня поговорим про регулярные выражения (они же – 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:

Когда необходимы 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 цифр

Field_Qlik as Field_R)

В этом варианте нам доступно гораздо большее число команд, нежели для QlikView, а соответственно, и возможностей намного больше. Но есть и свой минус – этот способ сложнее, т.к. необходимо иметь дополнительные знания по синтаксису R!

Коллеги, расскажите, а вы пробовали использовать RegEx в QlikView или Qlik Sense? Для каких задач?