Для чтения данных

Шаги для чтения (считыватели) могут считывать данные из входных файлов, получать их из подключенного дополнительного входного порта, читать из базы данных. Шаг DATA_GENERATOR занимается генерацией данных и тоже относится к этой группе, поскольку является начальным шагом.

Различают следующие шаги для чтения:

FLAT_FILE_READER - читает данные из плоского файла

DATABASE_READER - читает данные из базы данных

DATA_GENERATOR - генерирует данные по шаблону

SPREADSHEET_READER - читает данные из файла в форматах xlsx, xls

FLAT_FILE_READER

FLAT_FILE_READER считывает данные из плоских файлов в формате CSV и TXT с разделителями, фиксированной длины или смешанных текстовых файлов.

Порты FLAT_FILE_READER:

Тип портаНомерОбязательныйОписаниеМетаданные
Output0даДля корректных записейЛюбые
Output1 (в разработке)нетДля не корректных записейСтруктура метаданных ошибок приведена ниже

Атрибуты FLAT_FILE_READER:

АтрибутОбязательныйОписаниеВозможные значения
fileURLдаПуть к источнику данных (плоский файл) для чтения.${READ_DIR}/in.txt
charsetнетКодировка файла, читаемого с помощью этого шага.encoding="windows-1251"
dataPolicyнетОпределяет обработку неправильно отформатированных или неверных данных. Может принимать значения "strict", "lenient"dataPolicy="strict" по умолчанию
trimнетУказывает, следует ли удалять начальные и конечные пробелы из строк в момент прохождения данных через FLAT_FILE_READER.trim="true" по умолчанию

quotedStrings1

нетПоля, содержащие специальные символы (запятая, новая строка или двойные кавычки), должны быть заключены в кавычки. В качестве символа кавычки принимаются только одинарные/двойные кавычки. Если установлено значение true, специальные символы не рассматриваются как разделители и удаляются при чтении компонентом.
Пример: Чтобы прочитать входные данные "25"|"Джон", установите для параметра quotedStrings значение true и установите для символа кавычки значение quoteChar=""". В результате будут получены два поля: 25|Джон.
quotedStrings="true" по умолчанию

quoteChar1

нетСимволы, в которые будет заключено значение поля при quotedStrings="true".quoteChar="""

fieldDelimiter

нетРазделитель полейfieldDelimiter=","

recordDelimiter

нетРазделитель записейrecordDelimiter="/n"
1

По умолчанию значение этого атрибута наследуется из метаданных порта ?вывода? 0.

Пример. Чтение файла.

Например, есть файл customers.csv. Каждая запись в нем содержит три поля: «дата», «фамилия» и «имя», разделенные символом «|». Нужно считать этот файл для дальнейшей обработки в системе.

Данные в файле:

01.02.2011|Горилов|Алексей
29.12.2013|Нечаев|Илья
25.11.2016|Васькин|Николай
23.10.2019|Иванов|Григорий
19.09.2022|Горбунов|Евгений

Решение:

В файле задания нужно описать выходные метаданные шага. Опишите поля «date», «last_name» и «first_name». Установите для них типы данных «date», «string» и «string» соответственно.


    <Metadata id="ObjectWithPos">
        <Record fieldDelimiter="|" recordDelimiter="\n">
            <Field name="date" type="date" format="dd.mm.YY"/>
            <Field name="last_name" type="string"/>
            <Field name="first_name" type="string"/>
        </Record>
    </Metadata>

С помощью атрибута format="yyyy-MM-dd HH:mm:ss.SSS" можно указать используемый формат даты.

Файл будет считан системой во внутреннюю память:

datelast_namefirst_name
01.02.2011ГончаровАлексей
29.12.2013НечаевИлья
25.11.2016ВаськинНиколай
23.10.2019СеровГригорий
19.09.2022ГлинкаЕвгений

Обрезание данных

  1. Входные строки обрабатываются в соответствии с типом данных поля следующим образом:
  • Пробелы удаляются как из начала, так и из конца поля для типов данных boolean, date, integer.
  • Входная строка остаётся полем, включающим начальные и конечные пробелы в случае типа данных string.
  1. Если для атрибута trim установлено значение true, все начальные и конечные пробельные символы удаляются. Поле, состоящее только из пробелов, преобразуется в нулевое значение (строка нулевой длины). Значение false подразумевает сохранение всех начальных и конечных символов пробелов. Входная строка может содержать пробелы только если представляет строковый тип данных.

DATABASE_READER

DATABASE_READER считывает данные из базы данных. Поддерживает подключение к СУБД PostgreSQL, Oracle, MySQL. Подробнее про подключение к базам данных можно прочитать в разделе Соединения с базами данных.

DATABASE_READER считывает данные из базы данных

Порты DATABASE_READER:

Тип портаНомерОбязательныйОписаниеМетаданные
Output0даДля корректных записейЛюбые, но одинаковые на всех подключённых портах
1-nнет

Атрибуты DATABASE_READER:

АтрибутОбязательныйОписаниеВозможные значения
dbConnectionдаИдентификатор соединения с базой данных, которое будет использоваться для доступа к базе данных

<Connection id="conn0" dbURL="postgres://admin:admin@localhost:5432/dev"/>
sqlQueryдаSQL-запрос к базе, определенный в графе.

<attr name="sqlQuery">
<![CDATA[
    select * from table;
]]>
</attr>

Пример. Чтение записей из базы данных.

С помощью DATABASE_READER прочитайте данные из базы данных OneBridge из таблицы Customers.

Решение:

Для описания параметров соединения можно указать строку подключения в элементе Connection в атрибуте dbURL.

Описание параметров соединения в элементе Connection:


<Global>
    ...
    <Connection id="CONN_A" dbURL="${CONN_TYPE}://${DB_USER}:${DB_PASSWORD}@${DB_URL}:${DB_01_PORT}/${DB_DATABASE}"/>
    <GraphParameters>
        <GraphParameter name="CONN_TYPE" value="mysql"/>
        <GraphParameter name="DB_USER" value="user007"/>
        <GraphParameter name="DB_URL" value="234.1.1.0"/>
        <GraphParameter name="DB_PORT" value="5432"/>
        <GraphParameter name="DB_DATABASE" value="OneBridge"/>
    </GraphParameters>
<!--    <GraphParameters scopeNonce="d3WVmJ8eCaIC">
        <GraphParameter name="DB_PASSWORD" secure="true" value="Ir2m0qTbu12WW7RJILIvlv499fpbggCl02"/>
    </GraphParameters>--> 
    ...
</Global>

SQL-запрос для чтения данных из базы, записывается в атрибут Attr, определенный в элементе Node:


<Node id="db_reader" guiX="250" guiY="100" guiName="DATABASE_READER" dbConnection="CONN_A" type="DATABASE_READER">
    <Attr name= “sqlQuery”>
    <![CDATA[
        SELECT date, last_name, first_name 
        FROM public."Customers";
    ]]>
    </Attr>
</Node>

Этот запрос считает значения полей date, last_name, first_name из таблицы Customers из базы данных во внутреннюю память системы.

DATA_GENERATOR

DATA_GENERATOR генерирует данные по шаблону, вместо чтения данных из файла, базы данных или любого другого источника данных. Этот шаг может отправлять разные записи на разные выходные порты, используя возвращаемые значения функции generate.

Порты DATA_GENERATOR:

Тип портаНомерОбязательныйОписаниеМетаданные
Output0даДля сгенерированных записейЛюбые
1-nнет

Метаданные на выходных портах могут отличаться.

Атрибуты DATA_GENERATOR:

АтрибутОбязательныйОписаниеВозможные значения
generateдаОпределение способа создания записей, записанное в графе на языке преобразований
<attr name="generate">
    <![CDATA[
    let counter = 4;

    function generate() {
        counter+=1;
        $out[0].foo = counter;

        return ALL;
    }
    ]]>
</attr>
recordsNumberнетКоличество записей, которые необходимо создать. Отрицательное значение позволяет создать количество записей, ограниченное кодом в generate.recordsNumber="1"

Шаблон записи

Шаблон записи — это строка, содержащая все постоянные поля сгенерированных записей в виде записей с разделителями (с разделителями, определенными в метаданных на выходном порте) или фиксированной длины (с размерами, определенными в метаданных на выходном порте).

Последовательность полей

Последовательность полей можно определить в диалоговом окне, которое открывается после нажатия атрибута Последовательности. Диалоговое окно «Последовательности» выглядит следующим образом:

Диалоговое окно «Последовательности»

Диалоговое окно «Последовательности»

Случайные поля

Этот атрибут определяет значения всех полей, которые генерируются случайным образом. Для каждого поля вы можете определить его диапазон (т.е. минимальное и максимальное значения). Эти значения относятся к соответствующим типам данных согласно метаданным. Вы можете назначить случайные поля в диалоговом окне «Редактировать ключ», которое открывается после нажатия атрибута «Случайные поля».

Диалоговое окно «Редактирование значения»

Диалоговое окно «Редактирование значения»

Слева находится панель «Поля», справа — «Случайные поля», а внизу — панель «Случайные диапазоны». На последней панели вы можете указать диапазоны выбранного случайного поля. Там вы можете ввести конкретные значения. Перемещать поля между панелями «Поля» и «Случайные поля» можно, как описано выше – нажатием кнопок «Стрелка влево» и «Стрелка вправо».

Пример. Создание записей.

Пример в разработке

SPREADSHEET_READER

SPREADSHEET_READER считывает данные с указанных листов файлов формата .xls или .xlsx. Позволяет указывать маппинг данных из таблицы и метаданных OneBridge.

Должен иметь один выходной порт для успешно считанных записей.

Порты SPREADSHEET_READER:

Тип портаНомерОбязательныйОписаниеМетаданные
Output0даДля успешно считанных записейЛюбые
1неДля некорректных считанных записей

Атрибуты SPREADSHEET_READER:

АтрибутОбязательныйОписаниеВозможные значения
fileURLдаПуть к файлу проекта, из которого читать данные.fileURL="testFile.txt"
sheetнетНазвание или номер листа в excel документе. Нумерация страниц начинается с 0. Можно перечислить в атрибуте sheet через запятую либо указать множество листов с помощью «*», чтобы все листы читались по порядку с использованием одного маппинга для всех.sheet="Sheet1"
mappingнетСопоставляет ячейки электронной таблицы с полями OneBridge.
<Node fileURL="ssr01_in.xlsx" id="SPREADSHEET_DATA_READER" sheet="Sheet1" type="SPREADSHEET_READER">
	<attr name="mapping">
		<![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
			<mapping>
                <globalAttributes>
                    <orientation>VERTICAL</orientation>
                    <step>1</step>
                    <writeHeader>false</writeHeader>
                </globalAttributes>
                <defaultSkip>1</defaultSkip>
                <headerGroups>
                    <headerGroup skip="1">
                        <autoMappingType>ORDER</autoMappingType>
                        <headerRanges>
                            <headerRange begin="A2"/>
                            <headerRange begin="B2"/>
                        </headerRanges>
                    </headerGroup>
                </headerGroups>
            </mapping>
		]]>
	</attr>
</Node>
dataPolicy (в разработке)нетОпределяет обработку неправильно отформатированных или неверных данных. Может принимать значения "strict", "lenient"dataPolicy="strict" по умолчанию
passwordнетПароль для расшифровки файла,если он запаролен. Актально только для формата xlsx.password="faihfi4t9(&Yhflaieg)"

Пример. Сопоставление полей по порядку.

Нужно прочитать из файла таблицы с количеством проданных некой компанией товаров за первый квартал года. Таблицы имеют одинаковую структуру: название товара, январь, февраль, март. Компания международная. Каждый партнер может использовать свой язык, поэтому вы не можете сопоставить поля по имени.

лист 1:

ProductJanuaryFebruaryMarch
T1620600700
T2150150100

лист 2:

ТоварЯнварьФевральМарт
T1500400600
T2300400500

Решение:

Укажите атрибуты: fileURL, sheet, mapping.

Заполните маппинг следующим образом:

<Node fileURL="${DATAIN_DIR}/Book2.xlsx" sheet="*" type="SPREADSHEET_READER">
<attr name="mapping"><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<mapping>
    <globalAttributes>
        <orientation>VERTICAL</orientation>
        <step>1</step>
        <writeHeader>true</writeHeader>
    </globalAttributes>
    <defaultSkip>1</defaultSkip>
    <headerGroups>
        <headerGroup skip="1">
            <autoMappingType>ORDER</autoMappingType>
            <headerRanges>
                <headerRange begin="A1"/>
                <headerRange begin="B1"/>
                <headerRange begin="C1"/>
                <headerRange begin="D1"/>
            </headerRanges>
        </headerGroup>
    </headerGroups>
</mapping>
]]></attr>
</Node>