При эксплуатации сайта дистанционного обучения [1] зачастую возникают разнообразные небольшие задачи, например, генерация случайных фраз, поиск в тексте, пополнение базы данных и тому подобное. Для их решения разработано соответствующее количество приложений с похожим кодом. Возникла идея их объединить в одно приложение с целью повышения универсальности и "мощности" трансформации данных, уменьшения сроков выполнения аналогичных задач. Идея была реализована в виде нового приложения на языке C#. Приложение напоминает службу SQL Server Integration Services, которая наряду с высокой производительностью имеет и высокую цену.
Борзяк А.А., Исмаилова Л.Ю. Способ конвейерной обработки данных // ИТНОУ. 2018. №3. С.72-77, ISSN: 2587-6309
Структура управляющих данных
Приложение управляется данными. Имеется два уровня конфигурационных параметров. Верхний уровень задает последовательность команд трансформации. В нижнем уровне (ини-файл) определяются детали команд трансформации.
Задание на трансформацию (конвейер обработки) задается в виде команд через «;», например [IN1];[TRANSFORM4];[TRANSFORM5];[TRANSFORM6];[OUT1]
Каждая команда – это загрузка/выгрузка данных или трансформация (преобразование по некоторому алгоритму). Загрузка/выгрузка осуществляется источниками данных, в результате в памяти формируется массив строк для дальнейшей обработки.
Источник данных определяется параметрами:
file – имя файла;
enc – кодировка;
dir – in (входной файл), out (выходной файл), gen (генерация);
ng – число строк генерации.
Если файл начинается как http:, то предполагается загрузка данных из интернета. Особый случай – шаблон, т.е. файл, содержащий символ * . В этом случае создается список, куда добавляются все файлы, удовлетворяющие шаблону. Ко всем файлам из этого списка будет применена цепочка команд.
Трансформация данных определяется параметрами:
sp_in – входной разделитель;
sp_out – выходной разделитель;
order – новый порядок разделяемых элементов;
all=1 – объединить все строки в одну;
regexp – регулярное выражение;
regout – формат выхода;
modifonly=1 – если нет совпадения в строке, то она становится пустой;
regrep – строка для замены совпадения;
connection – строка соединения с базой данных.
Ини-файл состоит из секций, каждая из которых задает команду генерации / модификации данных. Кроме команд, определенных в ини-файле, имеются встроенные. К ним относятся:
SORT - сортировать массив строк по возрастанию;
SORTDESC - сортировать массив строк по убыванию;
UNIQUE- удалить дубликаты;
EMPTY_DEL –удалить пустые строки;
END – задает конец диапазона для обработки списка;
LIST – добавляет текущие строки в список обрабатываемых файлов.
Рассмотрим несколько примеров.
Пример 1. Генерация случайных фраз.
Для генерации нужно задать секцию [TEMPLATE],
[TEMPLATE]
[NAME] [ACT] [WHAT]$ [WHERE].
[NAME] [ACT] [WHERE] [WHAT]$.
Здесь задано 2 шаблона для псевдослучайных фраз, каждый шаблон выбирается случайно.
В свою очередь шаблон использует секции [NAME] (распадается на [NAME_M] и [NAME_F]) и [ACT], [WHAT], [WHERE]., которые в примере выглядят так:
[NAME_M]
Филимон
Харитон
Эдуард
Яков
[NAME_F]
Авдотья
Изабелла
Эмилия
Ярослава
[ACT]
купил(а)
достал(а)
заказал(а)
приобрел(а)
[WHAT]
100
200
300
[WHERE]
на ММВБ
в банке
на криптобирже
[TEMPLATE], [NAME], [NAME_M] и [NAME_F] - зарезервированные названия секций. Остальные названия произвольные. Вместо имени секции в шаблоне происходит замена на случайную строку внутри секции, получается что-то вида:
Авдотья заказала 300$ на ММВБ.
Эдуард достал 200$ в банке.
Ярослава на криптобирже достала 200$.
Изабелла приобрела 100$ на ММВБ.
Харитон заказал на ММВБ 300$.
Пример 2. Удаление дубликатов в csv-файле, изменение разделителя, сортировка по 3-ей колонке.
Зададим простые трансформации, которые разбивают входную строку с помощью разделителя sp_in, меняют порядок элементов (с помощью order) и формируют выходную строку, используя разделитель sp_out.
[TRANSFORM1]
order=2,0,1,3
sp_i n=,
sp_out=;
[TRANSFORM2]
order=1,2,0,3
sp_in=;
sp_out=;
[IN1]
file= c:\a1.txt
dir=in
[OUT1]
file= c:\a2.txt
dir=out
Имеем входной файл c:\a1.txt с данными
a2,b2,c2,d2
a3,b3,c3,d3
c1,b1,a1,d1
a2,b2,c2,d2
a3,b3,c3,d3
Если задать набор команд [IN1];UNIQUE;[TRANSFORM1];SORTDESC;[TRANSFORM2];[OUT1], то в выходном файле c:\a2.txt появятся строки
c1;b1;a1;d1
a2;b2;c2;d2
a3;b3;c3;d3
Дубликаты удалены, сортировка проведена.
Пример 3. Сложная трансформация на основе регулярных выражений [2], запись результата в базу данных.
[IN_LIST]
file=C: \in10.txt
enc=utf-8
dir=in
[IN2]
file=*
enc=utf-8
dir=in
[TR15]
regexp=.*?([a-zA-Z0-9_\.\-]+\@[a-zA-Z0-9\.\-]+\.+[a-zA-Z0-9]{2,4}).*
regout=INSERT INTO tblSubscribe (email, status) VALUES('{1}', 1);
modifonly=1
[TR16]
connection=server=mysql62.1gb.ru;charset=utf8;
[OUT2]
file=*
enc=utf-8
dir=out
Входной файл in10.txt содержит
http://isscctv.com/
http://lcs-sales.ru/
Если задать набор команд [IN_LIST];LIST;[IN2];[TR15];UNIQUE;EMPTY_DEL;[TR16];[OUT2] , то произойдет загрузка страниц из интернета, генерация текста, запись в базу данных, а в выходных файлах появятся строки вида
INSERT INTO tblSubscribe (email, status) VALUES('support@isscctv.com', 1);
INSERT INTO tblSubscribe (email, status) VALUES('info@isscctv.com', 1);
Пример 4. Форматирование группы файлов в папке (замена размера шрифта, удаление).
[IN_LIST]
file=C: \tests\7\page*.htm
enc=1251
dir=in
[IN1]
file=*
enc=1251
dir=in
[TRANSFORM8]
regexp=(10pt)
regrep=12pt
[TRANSFORM9]
regexp=(à)
regrep==>
[TRANSFORM10]
regexp=(10.0pt)
regrep=12pt
[TRANSFORM11]
regexp=(9.0pt)
regrep=12pt
[TRANSFORM12]
regexp=(5.0pt)
regrep=12pt
[TRANSFORM13]
regexp=(FONT-FAMILY:\s*?Wingdings;)
regrep=+
[TRANSFORM14]
regexp=(font-family:\s*?Wingdings;)
regrep=+
[OUT1]
file=*
enc=1251
dir=out
Для форматирования надо задать команды [IN_LIST];[IN1];[TRANSFORM8];[TRANSFORM9];[TRANSFORM10];[TRANSFORM11];[TRANSFORM12];[TRANSFORM13];[TRANSFORM14];[OUT1]
Время выполнения составляет доли секунды.
Заключение
Рассмотренные примеры показывают, что новое приложение может решать широкий круг задач по генерации / модификации текстовых данных. Стоит отметить простоту в использовании и реализации. Продолжая мыслить в рамках трансформаций, можно изобретать новые трансформации и встроенные команды для работы с веб-сервисами, обработки мультимедия-файлов, управления последовательностью выполнения, перезагрузки ини-файла и т.д.
Для пользователей сайта функционал трансформаций доступен в виде сервиса из личного кабинета.
Литература
- A. Borziak, Y. Gretsky "E-learning system 'Carat'". In: Proc. of 11th International Workshop on Computer Science and Information Technologies), Crete, Greece, October 5-8, 2009, Volume I, pp.224-226.
- Фридл Дж. Регулярные выражения, 3-е издание,Издательство Символ-Плюс, ISBN - 978-5-93286-121-9, 5-93286-121-5, 0-596-52812-4