<Array>
<!-- Источник массива -->
<Source></Source>
<!-- Получение индекса первого элемента. -->
<Filter>
<Not>
<And>
<Or>
<Filter Type="Equal">
<!-- или Field (для DC) или Index (для массивов)-->
<Field></Field>
<Index></Index>
<DataType Type=""></DataType>
<Value></Value>
</Filter>
</Or>
</And>
</Not>
</Filter>
<!-- Уникальные элементы в массиве. Если теги On не указаны, используется первый элемент -->
<Distinct>
<On Index="" />
</Distinct>
<!-- Сортировка. Если теги By не указаны, используется первый элемент и сортируется по возрастанию -->
<Order>
<By Index="" Type="Asc" />
<By Index="" Type="Desc" />
</Order>
<!-- Создать новый массив на основе существующего. Если Items.Count == 1 то возвращает одномерный массив -->
<Select>
<Items>
<!-- Элемент массива -->
<Item Type="Index"></Item>
<!-- Выбор из словаря -->
<Item Type="Field"><!-- название элемента словаря --></Item>
<!-- Скалярное значение -->
<Item Type="Value"></Item>
<!-- Порядковый номер элемента массива -->
<Item Type="Number" Start="0"></Item>
<!-- Форматирование значений -->
<Item Type="Format"></Item>
<!-- Работа с вложенными массивами -->
<Item Type="Action">
<Index><!-- индекс элемента массива --></Index>
<Actions><!-- цепочка действий. Доступны все действия над массивами--></Actions>
</Item>
<!-- Расчет выражения -->
<Item Type="Expression">
<!-- В выражении могут использоваться элементы массива ([0]) и дополнительные значения ({0}).-->
<!-- Дополнительно можно добавить переменную Index -->
<Expression>{0} > 0</Expression>
<Items>
<!-- Дополнительные значения -->
<Item></Item>
</Items>
</Item>
<!-- Подстановка значений -->
<Item>
<Index><!-- индекс элемента массива --></Index>
<Value><!-- таблица значений --></Value>
</Item>
</Items>
</Select>
</Array>
Полный шаблон Array
<Array>
<!-- Источник массива -->
<Source></Source>
<!-- Добавить в массив значение и вернуть новый массив -->
<Add></Add>
<!-- Возвращает элемент массива. Для одномерного массива возвращается скалярное значение. Для многомерного - одномерный массив значений -->
<ElementAt>
<Index><!-- value --></Index>
</ElementAt>
<!-- Удаление элементов из массива -->
<Remove>
<!-- Для удаления одного элемента -->
<Index></Index>
<!-- Для удаления нескольких элементов -->
<Indices>
<Index></Index>
</Indices>
<Structure Type="List">
<Item></Item>
<Item></Item>
<Item></Item>
</Structure>
</Remove>
<!-- Обновить элемент по индексу -->
<Update>
<Index></Index>
<!-- Для одномерного массива -->
<Value></Value>
<!-- Для многомерных массивов -->
<Value>
<Row>
<Item></Item>
</Row>
</Value>
</Update>
<!-- Создать новый массив на основе существующего. Операция Map. Если Items.Count == 1 то возвращает одномерный массив -->
<Select>
<Items>
<Item Type="Expression">
<!-- В выражении могут использоваться элементы массива ([0]) и дополнительные значения ({0}).-->
<!-- Дополнительно можно добавить переменную Index -->
<Expression>{0} > 0</Expression>
<Items>
<Item></Item>
<Items>
</Item>
<!-- Скалярное значение -->
<Item Type="Value"></Item>
<!-- Элемент массива -->
<Item Type="Index"></Item>
<!-- Порядковый номер элемента массива -->
<Item Type="Number" Start="0"></Item>
<!-- Форматирование значений -->
<Item Type="Format"></Item>
<!-- Работа с вложенными массивами -->
<Item Type="Action">
<Index><!-- индекс элемента массива --></Index>
<Actions><!-- цепочка действий. Доступны все действия над массивами--></Actions>
</Item>
<!-- Подстановка значений -->
<Item>
<Index><!-- индекс элемента массива --></Index>
<Value><!-- таблица значений --></Value>
</Item>
<!-- Выбор из словаря -->
<Item Type="Field"><!-- название элемента словаря --></Item>
</Items>
</Select>
<!-- Агрегация значений. Операция Reduce/Fold. Для одного элемента - скаляр. Для нескольких элементов одномерный массив значений -->
<Aggregate>
<Items>
<Item>
<!-- Начальное значение -->
<Result>0</Result>
<!-- В выражении могут использоваться элементы массива ([0]) и дополнительные значения ({0}).-->
<!-- Дополнительно можно добавить переменную Index -->
<!-- Полученный результат сохраняется в Result и вычисляется значение для следующей строки -->
<!-- Пример расчёта суммы -->
<Expression>{Result} + {0}</Expression>
<Items>
<Item></Item>
<Items>
</Item>
</Items>
</Aggregate>
<!-- Максимальный элемент. Только для одномерных массивов -->
<Max Type="" />
<!-- Минимальный элемент. Только для одномерных массивов -->
<Min Type="" />
<!-- Получение индекса первого элемента. -->
<Filter>
<Not>
<And>
<Or>
<Filter Type="Equal">
<!-- или Field (для DC) или Index (для массивов)-->
<Field></Field>
<Index></Index>
<DataType Type=""></DataType>
<Value></Value>
</Filter>
</Or>
</And>
</Not>
</Filter>
<!-- Первый элемент -->
<First />
<!-- Последний элемент -->
<Last />
<!-- Форматирует текущий массив в строку -->
<!-- Если элемент массива Dictionary<string, object>, то доступны поля по {Key}. Для одномерных массивов {0}, {1} -->
<Format></Format>
<!-- Объединяет текущий массив в строку с разделителем -->
<StringJoin Separator="<!-- разделитель элементов -->" LineSeparator="<!-- разделитель строк -->" />
<!-- Пропустить N строк -->
<Skip></Skip>
<!-- Взять из массива N строк -->
<Take></Take>
<!-- Количество элементов в массиве -->
<Count />
<!-- Уникальные элементы в массиве. Если теги On не указаны, используется первый элемент -->
<Distinct>
<On Index="" />
</Distinct>
<!-- Индекс элемента (только для одномерных массивов) -->
<!-- Содержимое тега аналогично тегу Filter -->
<IndexOf></IndexOf>
<!-- Преобразовать одномерный массив в многомерный. Для многомерных ничего не делается -->
<ToTable />
<!-- Преобразование значение в одномерный массив -->
<ToArray />
<!-- Преобразование двухмерного массива в массив словарей -->
<ToDictionary>
<!-- Атрибут Name: название элемента словаря -->
<!-- Атрибут Index: индекс элемента массива, который будет записан в словарь под именем указанным в атрибуте Name -->
<Key Name="" Index=""/>
</ToDictionary>
<!-- Сортировка (только для одномерных массивов) -->
<Sort />
<!-- Сортировка. Если теги By не указаны, используется первый элемент и сортируется по возрастанию -->
<Order>
<By Index="" Type="Asc" />
<By Index="" Type="Desc" />
</Order>
<!-- Объединение массивов -->
<Union><!-- массив --></Union>
<!-- Для ConvertDC. Для массива Dictionary<string, object> формирует массив из значений словаря по указанному ключу -->
<Field><!-- field name --></Field>
<!-- Преобразовать массив массивов ([[1,2,3,...], [4,5,...]]) в одномерный ([1,2,3,...,4,5,...]) -->
<SelectMany></SelectMany>
<!--Объединения массивов по ключам-->
<!-- Inner - текущий массив, Outer - массив с которыем будет соединён текущий -->
<Join>
<OuterArray><!-- массив с которым будет текущий соединён--></OuterArray>
<!--Ключи по которым будуд соединяться массивы-->
<Keys>
<!-- Атрибут Index: индекс элемента массива, который будет использоваться в качестве составного ключа -->
<!-- Количество тегов Inner и Outer должно совпадать -->
<Inner Index="" />
<Inner Index="" />
<Outer Index="" />
<Outer Index="" />
</Keys>
<!-- Результат объединения -->
<Result>
<!-- Атрибут Index: индекс элемента массива, который будет добавлен в результирующую строку. Если тег Inner, то значение будет выбрано из исходного массива. Если Outer, то из массива из тега OuterArray -->
<Inner Index="" />
<Inner Index="" />
<Outer Index="" />
<Outer Index="" />
</Result>
</Join>
<!-- Левостороннее соединение -->
<LeftJoin>
<OuterArray></OuterArray>
<Keys>
<Inner Index="" />
<Inner Index="" />
<Outer Index="" />
<Outer Index="" />
</Keys>
<Result>
<Inner Index="" />
<Inner Index="" />
<Outer Index="" />
<Outer Index="" />
</Result>
</LeftJoin>
<!-- Правостороннее соединение -->
<RightJoin>
<OuterArray></OuterArray>
<Keys>
<Inner Index="" />
<Inner Index="" />
<Outer Index="" />
<Outer Index="" />
</Keys>
<Result>
<Inner Index="" />
<Inner Index="" />
<Outer Index="" />
<Outer Index="" />
</Result>
</RightJoin>
<!-- Полное соединение -->
<FullJoin>
<OuterArray></OuterArray>
<Keys>
<Inner Index="" />
<Inner Index="" />
<Outer Index="" />
<Outer Index="" />
</Keys>
<Result>
<Inner Index="" />
<Inner Index="" />
<Outer Index="" />
<Outer Index="" />
</Result>
</FullJoin>
</Array>
Описание Array
Значение, которое будет передано в команду при выполнении.
В тэге <Source> указывается любое универсальное значение, с которым выполняются операции указанные после тэга <Source> - Operation1, Operation2. Операций может быть неограниченное количество. При этом операции будут выполняться последовательно в порядке объявления: для первой операции (Operation1) используется значение из тэга <Source>, для последующих операций - результат предыдущей операции.
Все операции можно разделить на группы:
Изменение
Агрегация
Поиск
Соединение
Выборка из массива
Преобразование
Сортировка
Изменение
Add
Добавляет элемент или элементы в массив.
<Add><!-- элементы для добавления --></Add>
При добавлении элементов используются следующие правила:
Матрица добавляется в Матрицу
Строки из матрицы, указанной в тэге <Value>, добавляются в конец матрицы из тэга <Source>.
+-----+----------+
| 1 | Text 1 |
| 2 | Text 2 |
| 3 | Text 3 |
| 4 | Text 4 |
+-----+----------+
Массив добавляется в Матрицу
В массив из тэга <Value> добавляются пустые элементы, чтобы длина массива соответствовала наибольшей длине строки матрицы, указанной в тэге <Source>, и полученный массив добавляются в конец матрицы.
Скаляр добавляется в Матрицу
Скаляр из тэга <Value> преобразуется в массив с длиной соответствующей наибольшей длине строки матрицы, указанной в тэге <Source>, и полученный массив добавляются в конец матрицы.
+-----+----------+
| 1 | Text 1 |
| 3 | Text 3 |
| 4 | Text 4 |
| 2 | Text 2 |
+-----+----------+
Массив добавляется в Матрицу
В массив из тэга <Value> добавляются пустые элементы, чтобы длина массива соответствовала наибольшей длине строки матрицы, указанной в тэге <Source>, и полученный массив добавляются в конец матрицы.
Скаляр добавляется в Матрицу
Скаляр из тэга <Value> преобразуется в массив с длиной соответствующей наибольшей длине строки матрицы, указанной в тэге <Source>, и полученный массив добавляются в конец матрицы.
Во всех случаях, когда в качестве значения тэга <Source> указан скаляр, будет генерироваться ошибка TypeMismatch.
Update
Обновляет элемент в массиве/матрице в указанной позиции.
<Update>
<Index><!-- индекс элемента --></Index>
<Value><!-- элемент для обновления --></Value>
</Update>
При обновлении элементов используются следующие правила:
Массив добавляется в Матрицу
В массив из тэга <Value> добавляются пустые элементы, чтобы длина массива соответствовала наибольшей длине строки матрицы, указанной в тэге <Source>, и полученный массив записывается в элемент с индексом <Index>.
Скаляр добавляется в Матрицу
Скаляр из тэга <Value> преобразуется в массив с длиной соответствующей наибольшей длине строки матрицы, указанной в тэге <Source>, и полученный массив записывается в элемент с индексом <Index>.
Матрица добавляется в Массив
Берет первый элемент первой строки матрицы, указанной в тэге <Value>, и записывается в элемент с индексом <Index> массива из тэга <Source>.
Массив добавляется в Массив
Берется первый элемент массива из тэга <Value> и записывается в элемент с индексом <Index> массива, указанном в тэге <Source>.
+-----+----------+
| 2 | Text 2 |
| 4 | Text 4 |
+-----+----------+
Агрегация
Aggregate
Вычисляет значения по формулам.
<Aggregate>
<Items>
<Item>
<Result><!-- Начальное значение --></Result>
<Expression><!-- Выражение для расчёта--></Expression>
<Items>
<!-- Дополнительные значение -->
<Item></Item>
<Items>
</Item>
</Items>
</Aggregate>
В выражении <Expression> могут использоваться элементы исходного массива (указываются в квадратных скобках []) или дополнительные значения, перечисленные в тэге <Items> (указываются в фигурных скобках {}). Также доступна переменная {Result}, в которой хранится значение, вычисленное для прошлого элемента.
Если элементов Item в Aggregate/Items несколько, то возвращается массив результатов агрегации. Если один, то скалярное значение.
Для вычисления выражений используется NCalc.
Если в качестве значения тэга <Source> указан скаляр, то будет генерироваться ошибка TypeMismatch.
Пример 1. Сумма и произведение всех элементов массива
В необязательном атрибуте Index для матриц указывается индекс столбца, в котором будет происходить поиск максимального элемента. Если атрибут не указан, то используется значение 0.
Если в качестве значения тэга <Source> указан скаляр, то будет генерироваться ошибка TypeMismatch.
Пример 1. Максимальный элемент в третьем столбце матрицы
В необязательном атрибуте Index для матриц указывается индекс столбца, в котором будет происходить поиск минимального элемента. Если атрибут не указан, то используется значение 0.
Если в качестве значения тэга <Source> указан скаляр, то будет генерироваться ошибка TypeMismatch.
Пример 1. Минимальный элемент в третьем столбце матрицы
В необязательном атрибуте Index для матриц указывается индекс столбца, для которого будет вычисляться сумма элементов. Если атрибут не указан, то используется значение 0.
Если в качестве значения тэга <Source> указан скаляр, то будет генерироваться ошибка TypeMismatch.
Пример 1. Сумма элементов в третьем столбце матрицы
Возвращает индекс первого элемента массива удовлетворяющего условию.
<!-- общий синтаксис для поиска -->
<IndexOf Type="">
<Field Name="" />
<!-- или -->
<Index Value="" />
<Value><!-- значение фильтра --></Value>
<DataType Type="" />
</IndexOf>
В необязательном атрибуте Type тэга <IndexOf> указывается тип сравнения значений. По умолчанию используется фильтр Equal.
Тэг <Field> применяется для выборки из массива словарей. В атрибуте Name указывается название поля словаря, по которому будет происходить проверка условия.
Тэг <Index> применяется для выборки из одномерного массива или матрицы. Для матриц в атрибуте Value указывается индекс элемента строки, по которому будет проверка условия.
Тэг <DataType> задаёт тип элемента. По умолчанию используется тип StringDataType.
В зависимости от типа фильтра тэги <Value> или <DataType> могут отсутствовать. Например, в фильтрах IsNull, IsNotNull.
Типы сравнения значений
Equal
Сравнение значений на равенство
NotEqual
Сравнение значений на неравенство
Greater
Сравнение значений на "больше": элемент массива больше указанного значения
GreaterOrEqual
Сравнение значений на "больше или равно": элемент массива больше или равен указанному значению
Less
Сравнение значений на "меньше": элемент массива меньше указанного значения
LessOrEqual
Сравнение значений на "меньше или равно": элемент массива меньше или равен указанному значению
Contains
Сравнение значений на "содержит": элемент массива содержит указанное значение, при этом все значения преобразуется в строку
NotContains
Сравнение значений на "не содержит": элемент массива не содержит указанное значение, при этом все значения преобразуется в строку
In
Сравнение значений на "входит": элемент массива входит в указанный массив
NotIn
Сравнение значений на "не входит": элемент массива не входит в указанный массив
Overlap
Сравнение значений на "пересекается": массив из элемента исходного массива имеет общие элементы с указанным массивом
NotOverlap
Сравнение значений на "не пересекается": массив из элемента исходного массива не имеет общие элементы с указанным массивом
MatchSearch
Сравнение значений на "удовлетворяет поисковой строке". Поисковая строка может состоять из слов, разделенных пробелами и символами "+", "*"и"?":
пробел означает "ИЛИ";
"+" означает "И";
"*" означает любое количество любых символов;
"?" означает ровно один символ.
NotMatchSearch
Сравнение значений на "не удовлетворяет поисковой строке".
Поисковая строка может состоять из слов, разделенных пробелами и символами "+", "*"и"?":
пробел означает "ИЛИ";
"+" означает "И";
"*" означает любое количество любых символов;
"?" означает ровно один символ.
ContainedIn
Сравнение значений на "входит": элемент массива входит в указанное значение, при этом все значения преобразуется в строку
NotContainedIn
Сравнение значений на "не входит": элемент массива не входит в указанное значение, при этом все значения преобразуется в строку
IsNull
Сравнение на Null
IsNotNull
Сравнение на "не Null"
Nested
Если в качестве значения тэга <Source> указан скаляр, то будет генерироваться ошибка TypeMismatch.
Пример 1. Индекс первого элемента массива, который больше 10
Возвращает элементы массива, удовлетворяющие условию.
<!-- общий синтаксис для фильтров -->
<Filter Type="">
<Field Name="" />
<!-- или -->
<Index Value="" />
<Value><!-- значение фильтра --></Value>
<DataType Type="" />
</Filter>
В необязательном атрибуте Type тэга <Filter> указывается тип фильтра. По умолчанию используется фильтр Equal.
Тэг <Field> применяется для выборки из массива словарей. В атрибуте Name указывается название поля словаря, по которому будет происходить проверка условия.
Тэг <Index> применяется для выборки из одномерного массива или матрицы. Для матриц в атрибуте Value указывается индекс элемента строки, по которому будет проверка условия.
Тэг <DataType> задаёт тип элемента. По умолчанию используется тип StringDataType.
В зависимости от типа фильтра тэги <Value> или <DataType> могут отсутствовать. Например, в фильтрах IsNull, IsNotNull.
Типы фильтров
Equal
Сравнение значений на равенство
NotEqual
Сравнение значений на неравенство
Greater
Сравнение значений на "больше": элемент массива больше указанного значения
GreaterOrEqual
Сравнение значений на "больше или равно": элемент массива больше или равен указанному значению
Less
Сравнение значений на "меньше": элемент массива меньше указанного значения
LessOrEqual
Сравнение значений на "меньше или равно": элемент массива меньше или равен указанному значению
Contains
Сравнение значений на "содержит": элемент массива содержит указанное значение, при этом все значения преобразуется в строку
NotContains
Сравнение значений на "не содержит": элемент массива не содержит указанное значение, при этом все значения преобразуется в строку
In
Сравнение значений на "входит": элемент массива входит в указанный массив
NotIn
Сравнение значений на "не входит": элемент массива не входит в указанный массив
Overlap
Сравнение значений на "пересекается": массив из элемента исходного массива имеет общие элементы с указанным массивом
NotOverlap
Сравнение значений на "не пересекается": массив из элемента исходного массива не имеет общие элементы с указанным массивом
MatchSearch
Сравнение значений на "удовлетворяет поисковой строке". Поисковая строка может состоять из слов, разделенных пробелами и символами "+", "*"и"?":
пробел означает "ИЛИ";
"+" означает "И";
"*" означает любое количество любых символов;
"?" означает ровно один символ.
NotMatchSearch
Сравнение значений на "не удовлетворяет поисковой строке".
Поисковая строка может состоять из слов, разделенных пробелами и символами "+", "*"и"?":
пробел означает "ИЛИ";
"+" означает "И";
"*" означает любое количество любых символов;
"?" означает ровно один символ.
ContainedIn
Сравнение значений на "входит": элемент массива входит в указанное значение, при этом все значения преобразуется в строку
NotContainedIn
Сравнение значений на "не входит": элемент массива не входит в указанное значение, при этом все значения преобразуется в строку
IsNull
Сравнение на Null
IsNotNull
Сравнение на "не Null"
Nested
Составной фильтр. Для соединения вложенных фильтров доступны тэги <And>, <Or>, <Not>
Если в качестве значения тэга <Source> указан скаляр, то будет генерироваться ошибка TypeMismatch.
При объединении элементов используются следующие правила:
Матрица объединяется с Матрицей
В каждую строку матрицы из тэга <Concat> добавляются пустые элементы, чтобы длина строки соответствовала наибольшей длине строки матрицы, указанной в тэге <Source>, и полученная матрица объединяется с матрицей из тэга <Source>.
+-----+----------+
| 1 | Text 1 |
| 2 | Text 2 |
| 3 | Text 3 |
| 2 | Text 2 |
+-----+----------+
Массив объединяется с Матрицей
Массив из тэга <Concat> преобразуется в матрицу. В каждую строку новой матрицы добавляются пустые элементы, чтобы длина строки соответствовала наибольшей длине строки матрицы, указанной в тэге <Source>, и полученная матрица объединяется с матрицей из тэга <Source>.
Скаляр объединяется с Матрицей
Скаляр из тэга <Concat> преобразуется в матрицу. В единственную строку новой матрицы добавляются пустые элементы, чтобы длина строки соответствовала наибольшей длине строки матрицы, указанной в тэге <Source>, и полученная матрица объединяется с матрицей из тэга <Source>.
+-----+----------+
| 1 | Text 1 |
| 2 | Text 2 |
| 3 | |
+-----+----------+
Матрица объединяется с Массивом
Матрица из тэга <Concat> преобразуется в массив, при этом берутся первые элементы каждой строки. Полученный массив объединяется с массивом из тэга <Source>.
Во всех случаях, когда в качестве значения тэга <Source> указан скаляр, будет генерироваться ошибка TypeMismatch.
Union
Объединяет два массива без сохранения дубликатов.
<Union><!-- массив для объединения --></Union>
При объединении элементов используются следующие правила:
Матрица объединяется с Матрицей
В каждую строку матрицы из тэга <Union> добавляются пустые элементы, чтобы длина строки соответствовала наибольшей длине строки матрицы, указанной в тэге <Source>, и полученная матрица объединяется с матрицей из тэга <Source>.
+-----+----------+
| 1 | Text 1 |
| 2 | Text 2 |
| 3 | Text 3 |
+-----+----------+
Массив объединяется с Матрицей
Массив из тэга <Union> преобразуется в матрицу. В каждую строку новой матрицы добавляются пустые элементы, чтобы длина строки соответствовала наибольшей длине строки матрицы, указанной в тэге <Source>, и полученная матрица объединяется с матрицей из тэга <Source>.
Скаляр объединяется с Матрицей
Скаляр из тэга <Union> преобразуется в матрицу. В единственную строку новой матрицы добавляются пустые элементы, чтобы длина строки соответствовала наибольшей длине строки матрицы, указанной в тэге <Source>, и полученная матрица объединяется с матрицей из тэга <Source>.
+-----+----------+
| 1 | Text 1 |
| 2 | Text 2 |
| 3 | |
+-----+----------+
Матрица объединяется с Массивом
Матрица из тэга <Union> преобразуется в массив, при этом берутся первые элементы каждой строки. Полученный массив объединяется с массивом из тэга <Source>.
Т.е. будет таблица из двух колонок и двух строк. В первой строке в первой колонке будет скалярный элемент со значением 1, а во второй колонке будет храниться таблица с двумя строками из источника. Во второй строке во второй колонке будет храниться таблица с одной строкой.
Zip
Соединяет строки двух массивов таким образом, что первый элемент исходного массива соединяется с первым элементом массива, второй со вторым и т.д.
<Zip><!-- элементы для соединения --></Zip>
Длина нового массива соответствует длине наименьшего из массивов.
При объединении элементов используются следующие правила:
Матрица объединяется с Матрицей
В конец каждой строки исходной матрицы добавляются элементы из соответствующей строки матрицы, указанной в тэге <Zip>.
+-----+----------+-----+
| 1 | Text 1 | 3 |
+-----+----------+-----+
Матрица объединяется с Массивом
Матрица из тэга <Zip> преобразуется в массив, при этом берутся первые элементы каждой строки. Полученный массив объединяется с массивом из тэга <Source>, при этом элементы массивов образуют строки новой матрицы.
Массив объединяется с Массивом
Элемент массив из тэга <Zip> объединяется с соответствующим элементом массива из тэга <Source> так, что образуют строку новой матрицы.
Скаляр объединяется с Массивом
Скаляр из тэга <Zip> преобразуется в массив, и элементы полученного массива соединяются с элементами массива из тэга <Source>.
Формирует массив из массива словарей.
Из каждого словаря достает элемент по ключу, имя которого указано в атрибуте Name тэга <Field>. Если ключ отсутствует в словаре, то возвращается Null.
<Field Name="" />
Если в качестве значения тэга <Source> указан не массив словарей, то выбрасывается исключение TypeMismatch.
В тэге <Items> указываются селекторы, которые последовательно применяются к каждому элементу исходного массива (для матриц элементом является строка матрицы). Из значений селекторов формируется новый массив или матрица.
Если в качестве значения тэга <Source> указан скаляр, то будет генерироваться ошибка TypeMismatch.
Селекторы можно комбинировать друг с другом.
Поддерживаются селекторы следующих видов:
Index - Выбирает элемент из исходного массива или матрицы.
<Item Type="Index"><!-- индекс элемента --></Item>
+-----+----------+-------+
| 1 | Text 1 | 100 |
| 2 | Text 2 | 100 |
| 3 | Text 3 | 100 |
+-----+----------+-------+
Number - Подставляет порядковый номер элемента.
В необязательном атрибуте Start можно задать начальное значение последовательности. По умолчанию используется 0.
+-----+-----+----------+
| 5 | 1 | Text 1 |
| 6 | 2 | Text 2 |
| 7 | 3 | Text 3 |
+-----+-----+----------+
Expression - Вычисляет выражение на основе данных массива и дополнительных переменных.
Тэгов <Item> может быть любое количество. В выражении <Expression> могут использоваться элементы исходного массива (указываются в квадратных скобках []) или дополнительные значения, перечисленные в тэге <Items> (указываются в фигурных скобках {}).
<Item Type="Expression">
<Expression><!-- выражение --></Expression>
<Items>
<!-- дополнительные значения -->
<Item></Item>
</Items>
</Item>
+-----+----------------+
| 1 | Text 2 (200) |
| 2 | Text 1 (400) |
| 3 | Text 1 (300) |
+-----+----------------+
Action - Элемент на основе вложенного массива.
В тэге <Actions> указываются операции по работе с массивами аналогично тэгу <Array>. Исходным массивом для первой операции будет элемент массива с индексом из тэга <Index>.
<Item Type="Action">
<Index><!-- индекс элемента исходного массива --></Index>
<Actions></Actions>
</Item>
Пример 1. Группировка строк по первому столбцу и расчет суммы вторых столбцов для каждой группы
Substitution - Выбор значения из таблицы подстановки.
В качестве таблицы подстановки должна быть матрица, состоящая из двух столбцов. В первом столбце должен быть ключ, по которому будет идти подстановка, а во втором - значение, которое будет использоваться при подстановке.
Обязательный атрибут Separator используется для задания разделителя элементов массива или элементов строки матрицы.
Необязательный атрибут LineSeparator используется для задания разделителя строк в матрице. По умолчанию используется значение, указанное в атрибуте Separator.
Для задания "новой" строки используется сочетание символов: \r\n.
Преобразует входное значение в строку, которую затем разделяет по заданному разделителю.
<StringSplit Separator="" />
Обязательный атрибут Separator используется для задания разделителя, по которому строка будет разделена.
Для разбиения по "новой" строке используется сочетание символов: \r\n.
Так как тэг <Source> всегда возвращает массив, то необходимо использовать тэг <First> (или любой другой способ), чтобы получить элемент массива, которой будет преобразовываться в строку и разбиваться по заданному разделителю.
Если в качестве значения тэга <Source> указано нескалярное значение, то будет генерироваться ошибка TypeMismatch.
Преобразует массив или скалярное значение в матрицу.
<ToTable />
Преобразование происходит по следующим правилам:
Массив преобразуется в матрицу
Создается матрица с количеством строк равным количеству элементов входного массива, и каждый элемент массива пишется в отдельную строку матрицы.
Скаляр преобразуется в матрицу
Создается матрица из одной строки, в которую пишется входное скалярное значение.
Пример
<Array>
<Source>2</Source>
<ToTable />
</Array>
Результат:
+-----+
| 2 |
+-----+
ToArray
Преобразует входное значение в массив, если значение скаляр, для массивов возвращает исходное значение.
<ToArray />
Пример
<Array>
<Source>10</Source>
<ToArray />
</Array>
Результат:
+------+
| 10 |
+------+
Сортировка
Order
Сортирует элементы массива и матрицы по указанным индексам.
<Order>
<By Index="" Type="" />
</Order>
Тэгов <By> может быть неограниченное количество.
В атрибуте Index указывается индекс элемента строки матрицы, по которому будет происходить сортировка. Если в исходном матрице отсутствует элемент с указанным индексом, то такое условие сортировки будет игнорироваться.
В необязательном атрибуте Type указывается тип сортировки: Asc для сортировки элементов по возрастанию (значение по умолчанию) или Desc для сортировки по убыванию.
Если в качестве значения тэга <Source> указан скаляр, то будет генерироваться ошибка TypeMismatch.