Способ конвейерной обработки данных

Блог 15 апреля 2018

Теги: конвейерная обработка, трансформация данных, регулярные выражения

При эксплуатации сайта дистанционного обучения [1] зачастую возникают разнообразные небольшие задачи, например, генерация случайных фраз, поиск в тексте, пополнение базы данных и тому подобное. Для их решения разработано соответствующее количество приложений с похожим кодом. Возникла идея их объединить в одно приложение с целью повышения универсальности и "мощности" трансформации данных, уменьшения сроков выполнения аналогичных задач. Идея была реализована в виде нового приложения на языке C#. Приложение напоминает службу SQL Server Integration Services, которая наряду с высокой производительностью имеет и высокую цену.

Структура управляющих данных

Приложение управляется данными. Имеется два уровня конфигурационных параметров. Верхний уровень задает последовательность команд трансформации. В нижнем уровне (ини-файл) определяются детали команд трансформации.

Задание на трансформацию (конвейер обработки) задается в виде команд через «;», например [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]

Время выполнения составляет доли секунды.

 

Заключение

Рассмотренные примеры показывают, что новое приложение может решать широкий круг задач по генерации / модификации текстовых данных. Стоит отметить простоту в использовании и реализации. Продолжая мыслить в рамках трансформаций, можно изобретать новые трансформации и встроенные команды для работы с веб-сервисами, обработки мультимедия-файлов, управления последовательностью выполнения, перезагрузки ини-файла и т.д.

Для пользователей сайта функционал трансформаций доступен в виде сервиса из личного кабинета.

Литература

  1. 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.
  2. Фридл Дж. Регулярные выражения, 3-е издание,Издательство Символ-Плюс, ISBN - 978-5-93286-121-9, 5-93286-121-5, 0-596-52812-4

Комментарии

yura: 20-05-2018 23:34

зашибись

ждем генератор последовательности команд с возможностью обученияyes

Добавить комментарий могут только авторизованные пользователи. Авторизоваться
Комментарий

Оценка





Авторизоваться через https://www.pvobr.ru
Логин
Пароль
Регистрация

Авторизоваться через соцсети
Наверх