Массивы структурированных записей

Массивы структурированных записей (МСЗ) в логическом представлении являются таблицами, состоящими из последовательности определённым образом структурированных строк. По сути дела - это таблицы, элементы на пересечении строк и столбцов которых могут иметь любые значение. Частным случаем массивов со структурированными записями являются матрицы.
Не все элементы могут быть заполнены. Строки и столбцы могут иметь произвольную идентификацию. Если идентификатор строки или столбца явно не задаётся, то им становится очередное целое число, которое ещё не было использовано для идентификации предыдущих строк (столбцов). Массивы структурированных записей могут создаваться:
непосредственно в тексте статьи;
на основе табличных данных, размещаемых в файлах, секциях или разделах;
на основе потоков данных, размещаемых в файлах, секциях или разделах.
После создания с массивами структурированных записей можно выполнять различные манипуляции: выбирать строки и колонки, двумерные объекты данных, сортировать, транспонировать, выводить на страницу целиком или фрагментарно в виде таблиц и т.д. Однако их основное назначение - быть поставщиками нужным образом организованных данных. Часть отчётов ядра системы основана на функционале обработки массивов структурированных записей. Также они используются расширениями: Линейная алгебра, Синхронистические таблицы, Табличные данные и некоторыми другими.

Создание массивов структурированных записей в тексте статьи

Для создания массива структурированных записей непосредственно в тексте статьи можно использовать функцию massiv(), заполняя с её построчно.
Разметка
~a('1')=massiv('Фирма1 10 30 50 2023-11-11')
~a('2')=massiv('Фирма2 20 50 40 2023-10-15')
~a('3')=massiv('Фирма3 15 35 45 2023-06-12')
@mszvm(a)
Вывод
0
1
2
3
4
1
Фирма1
10
30
50
2023-11-11
2
Фирма2
20
50
40
2023-10-15
3
Фирма3
15
35
45
2023-06-12
В качестве разделителя можно использовать не только пробел, но и другие символы. Для этого вторым параметром функции massiv следует указать этот разделитель явно.
Разметка
~b('s1')=massiv('11;Bank of China;China;98.1;22.1;2033.8;131.7',';')
~b('s2')=massiv('13;Chevron;United States;222.6;26.2;233;232.5',';')
~b('s3')=massiv('14;Volkswagen Group;Germany;254;28.6;408.2;94.4',';')
@mszvm(b)
Вывод
0
1
2
3
4
5
6
s1
11
Bank of China China
98,1
22,1
2 034
132
s2
13
Chevron United States
223
26,2
233
233
s3
14
Volkswagen Group Germany
254
28,6
408
94,4
В приведённом примере строкам присвоены имена. Главное требование к такому имени строки состоит в том, чтобы его нельзя было идентифицировать как число. Такие строки называются идентифицированными. Все же ключи строк массива из предыдущего примера являются числовыми и потому они не являются идентифированными. В общем случае массив может содержать как идентифицированные, так и неидентифицированные строки. Порядок обработки идентифицированных и неидентифицированных строк в ряде случаев может существенно отличаться.
При создании массивов структурированных записей непосредственно в тексте статьи имена колонкам можно присвоить с помощью функции massiv, указав в ней ключи перед каждым значением.
Разметка
~a('1')=massiv('n:Фирма1 x1:10 x2:30 x2:50 d:2023-11-11')
~a('2')=massiv('n:Фирма2 x1:20 x2:50 x2:40 d:2023-10-15')
~a('3')=massiv('n:Фирма3 x1:15 x2:35 x2:45 d:2023-06-12')
@mszvm(a)
Вывод
n
x1
x2
d
1
Фирма1
10
50
2023-11-11
2
Фирма2
20
40
2023-10-15
3
Фирма3
15
45
2023-06-12
Для полностью заполненных колонок этот способ не удобен. Однако, если колонки массивов являются разреженными, то он вполне приемлем, поскольку позволяет пропускать отсутствующие данные, прямо указывая на принадлежность элемента строки к конкретной колонке.
Разметка
~a('1')=massiv('n:Фирма1 x1:10 a:30 x2:50 d:2023-11-11')
~a('2')=massiv('n:Фирма2 x1:20 b:50 x2:40 d:2023-10-15')
~a('3')=massiv('n:Фирма3 x1:15 b:35 x3:45 d:2023-06-12')
@mszvm(a)
Вывод
n
x1
a
x2
d
b
x3
1
Фирма1
10
30
50
2023-11-11
2
Фирма2
20
40
2023-10-15
50
3
Фирма3
15
2023-06-12
35
45

Загрузка массива из источника данных

Источником данных массива структурированных записей могут быть:
секции публикаций;
разделы файлов, содержащих массивы данных расширений;
произвольные текстовые файлы.
Во всех них данные могут представлены в виде табличных данных или потока данных.
Табличные данные являются последовательностью строк, каждая из которых отождествляется с одной строкой массива. В каждой такой строке данные, относящиеся к различным колонкам, разделяются определённым символом-разделителем. В последовательности строк могут находиться специальные управляющие строки, определяющие особенности ввода, назначение имён колонкам и формирования результатного массива. В целом, этот формат представления исходных данных весьма схож с широко распространённым форматом csv, но всё же некоторым образом от него отличается.
Поток данных - это специфический формат системы, представляющий собой последовательность разделённых определённым символом-разделителем блоков строк, все из которых интерпретируются как Массивы Ключ/Значение. При обработке потока данных каждый такой массив становится отдельной неидентифицированной строкой массива структурированных записей. Потоки данных удобны для формирования массивов, отдельные элементы которых являются многострочными текстами.
Массив структурированных данных может формироваться из нескольких источников данных. Для этого сначала он определённым образом создаётся, а потом пополняется посредством обращения с помощью встроенных функций к требуемым источникам.

Функция mszzt - загрузить таблицу

Функция mszzt(p) позволяет преобразовать последовательность строк из источника данных, определяемого параметром элементом d параметра p, в массив структурированных записей. Содержимое источника загружается, интерпретируется как табличные данные и преобразуется в результатный массив структурированных записей. Рассмотрим примеры.
В данной статье имеется секция s01 следующего содержания:
11;Bank of China;China;98.1;22.1;2033.8;131.7
12;Wells Fargo;United States;91.2;18.9;1423;201.3
13;Chevron;United States;222.6;26.2;233;232.5
14;Volkswagen Group;Germany;254;28.6;408.2;94.4
15;Apple;United States;164.7;41.7;196.1;416.6
Для её конвертации в массив структурированных записей следует использовать функцию mszzt("d:*~s01").
Разметка
~a=mszzt("d:*~s01")
@vmt(a)
Вывод
0
1
2
3
4
5
6
0
11
Bank of China China
98,1
22,1
2 034
132
1
12
Wells Fargo United States
91,2
18,9
1 423
201
2
13
Chevron United States
223
26,2
233
233
3
14
Volkswagen Group Germany
254
28,6
408
94,4
4
15
Apple United States
165
41,7
196
417
В данном случае ни строкам, ни столбцам массива имена не присвоены. В их качестве выступают последовательные целые числа. Чтобы присвоить имена колонкам в источнике данных их нужно определить с помощью служебной строки, которая должна начинаться с символа @ после которого через пробелы должны быть указаны имена колонок. В данной статье имеется секция s02 следующего содержания:
@ rang firma strana x1 x2 x3
11;Bank of China;China;98.1;22.1;2033.8;131.7
12;Wells Fargo;United States;91.2;18.9;1423;201.3
13;Chevron;United States;222.6;26.2;233;232.5
14;Volkswagen Group;Germany;254;28.6;408.2;94.4
15;Apple;United States;164.7;41.7;196.1;416.6
Для её конвертации в массив структурированных записей следует использовать функцию mszzt("d:*~s02").
Разметка
~a=mszzt("d:*~s02")
@vmt(a)
Вывод
rang
firma
strana
x1
x2
x3
6
0
11
Bank of China China
98,1
22,1
2 034
132
1
12
Wells Fargo United States
91,2
18,9
1 423
201
2
13
Chevron United States
223
26,2
233
233
3
14
Volkswagen Group Germany
254
28,6
408
94,4
4
15
Apple United States
165
41,7
196
417
Из приведённого примера видно, что колонкам таблицы присвоены имена, указанные в служебной строке. Однако в ней упоминается только шесть имён, а столбцов в таблице - семь. Поскольку седьмому столбцу имя не назначено в его качестве выступает номер 6, поскольку в системе нумерация столбцов начинается с нуля, а не с единицы.
Имена можно переназначать в процессе ввода. Для этого следует повторно использовать @-строку. Это может быть нужно, например, в том случае, если в источнике объединяется несколько разных источников, в которых данные вводились в разном порядке. В данной статье имеется секция s03 следующего содержания:
@ rang firma strana x1 x2 x3 x4
11;Bank of China;China;98.1;22.1;2033.8;131.7
12;Wells Fargo;United States;91.2;18.9;1423;201.3
@ rang x1 x2 x3 x4 firma strana
13;222.6;26.2;233;232.5;Chevron;United States
14;254;28.6;408.2;94.4;Volkswagen Group;Germany
15;164.7;41.7;196.1;416.6;Apple;United States
Здесь в разных частях источника одинаковые по сути данные вводились в разном порядке. Однако за счёт переустановки порядка имён все данные в результатном массиве попали в нужные колонки.
Разметка
~a=mszzt("d:*~s03")
@vmt(a)
Вывод
rang
firma
strana
x1
x2
x3
x4
0
11
Bank of China China
98,1
22,1
2 034
132
1
12
Wells Fargo United States
91,2
18,9
1 423
201
2
13
Chevron United States
223
26,2
233
233
3
14
Volkswagen Group Germany
254
28,6
408
94,4
4
15
Apple United States
165
41,7
196
417
Разделителем значений в каждой строке источника по умолчанию является символ ; (точка с запятой). Если при подготовке данных использовался другой разделитель, то его надо указать явно в строке параметров, которая должна начинаться с символа #, после которого через пробелы размещаются параметры в формате ключ:значение, определяющие порядок интерпретации последующих данных и способ формирования результатного массива. На текущий момент таких параметров два:
rk - разделитель колонок;
kk - номер колонки ключей строк (отсчёт с нуля).
Разделитель колонок rk определяет символ, разделяющий данные колонок в каждой последующей строке. Кроме обычных символов, можно использовать и их специфические обозначения:
$t - если колонки разделяются символом табуляции;
$p - если колонки разделяются символом пробела.
Если задан параметр kk, то он определяет номер колонки (отсчёт с нуля), значение в которой будет ключом строки. Если в текущей строке колонка с таким номером отсутствует, то строка пропускается и в массив не попадает. Значения в указанной колонке должны быть уникальны для каждой строки. В противном случае в массиве останется только последняя строка со значением ключа из данной колонки. Служебная #-строка может использоваться многократно. В данной статье имеется секция s04 следующего содержания:
# rk:!& kk:0
@ rang firma strana x1 x2 x3 x4
11!&Bank of China!&China!&98.1!&22.1!&2033.8!&131.7
*Комментарий 1
12!&Wells Fargo!&United States!&91.2!&18.9!&1423!&201.3
13!&Chevron!&United States!&222.6!&26.2!&233!&232.5
;Комментарий 2
14!&Volkswagen Group!&Germany!&254!&28.6!&408.2!&94.4
15!&Apple!&United States!&164.7!&41.7!&196.1!&416.6
Разметка
~a=mszzt("d:*~s04")
@vmt(a)
Вывод
firma
strana
x1
x2
x3
x4
11
Bank of China China
98,1
22,1
2 034
132
12
Wells Fargo United States
91,2
18,9
1 423
201
13
Chevron United States
223
26,2
233
233
14
Volkswagen Group Germany
254
28,6
408
94,4
15
Apple United States
165
41,7
196
417
В данном примере разделителем колонок параметр rk устанавливает комбинацию символов !&, параметр kk указывает на то, что значения в колонке 0 должны выступать как имена строк. В результате значения колонки 0 (rang) в итоговый массив не попадают, но становятся ключами (индексами) его соответствующих строк. В данных примера заданы комментарии, размещённые в строках, которые начинаются либо с символа ;, либо с символа *. При обработке данных такие строки игнорируются.

Функция mszzp - загрузить поток данных

Функция mszzp(p) позволяет преобразовать поток данных из указанного параметром p источника в массив структурированных записей. Параметр p представляет собой массив или строку, включающую в числе прочего параметры в формате ключ:значение, являющиеся указателем на источник данных. Содержимое источника загружается, интерпретируется как потоковые данные и преобразуется в результатный массив структурированных записей.
Поток данных представляет собой последовательность блоков строк, в которой каждый блок интерпретируется как массив ключ/значение (см. Массивы Ключ/Значение ). Блоки строк разделяются последовательностями символов-разделителей, каждый из которых занимает отдельную строку. По умолчанию разделителем блоков является пустая строка. Каждый блок преобразуется в массив ключ/значение и становится строкой МСЗ. Рассмотрим примеры.
В данной статье имеется секция s06, содержащая поток данных следующего содержания:
d 532
t Народное восстание «Ника» в Константинополе против фискальной политики Юстиниана I. Восстание подавлено.
l Византия Восстания

d 533
t 533 — 534 Армия вандалов разбита византийским полководцем Велисарием, после чего Вандальское королевство прекратило свое существование.
l Византия Вандалы

d 534
t Франки завоевали Бургундское королевство.
l Франки Франция

d 535
t 535 — 554 Византийские войска во главе с Велисарием, а затем Нарсесом изгнали остготов из Италии.
l Византия Италия

d 536
t Франки отняли у остготов Прованс.
l Франки Франция

d 540
t 540 — 562 Война Византии с Ираном. По мирному договору Византия и Иран разделили Грузию между собой. Византия обязалась платить Ирану ежегодную дань, но не допустила персов к побережью Черного и Средиземного морей.
l Византия Иран

d 547
t Византийский император Юстиниан I позволяет германскому племени лангобардов поселиться на территории современных Венгрии и Восточной Австрии.
l Византия Венгрия Австрия Лангобарды
Для её конвертации в массив структурированных записей следует использовать функцию mszzp("d:*~s06").
Разметка
~a=mszzp("d:*~s06")
@vmt(a)
Вывод
d
t
l
0
532
Народное восстание «Ника» в Константинополе против фискальной политики Юстиниана I. Восстание подавлено. Византия Восстания
1
533
533 — 534 Армия вандалов разбита византийским полководцем Велисарием, после чего Вандальское королевство прекратило свое существование. Византия Вандалы
2
534
Франки завоевали Бургундское королевство. Франки Франция
3
535
535 — 554 Византийские войска во главе с Велисарием, а затем Нарсесом изгнали остготов из Италии. Византия Италия
4
536
Франки отняли у остготов Прованс. Франки Франция
5
540
540 — 562 Война Византии с Ираном. По мирному договору Византия и Иран разделили Грузию между собой. Византия обязалась платить Ирану ежегодную дань, но не допустила персов к побережью Черного и Средиземного морей. Византия Иран
В данном примере поток данных состоит из семи блоков, разделённых пустыми строками. Каждая строка внутри блока начинается ключом строки. В данном примере ключами являются d,t,l. После ключа размещаются данные, соответствующие данному ключу. При преобразовании каждый блок становится отдельной неидентифицированной строкой, содержащей элементы, определяемые ключами строк блока.
Если использовать разделитель по умолчанию, то наличие многострочных фрагментов с пустыми строками внутри блоков не допускается. В этом случае должен быть определён другой разделитель блоков с помощью служебной строки параметров потока, задаваемых через пробелы в формате ключ:значение. На текущий момент здесь может использоваться только параметр r, определяющий не содержащую пробелов последовательность символов, разделяющих блоки данных.
В данной статье имеется секция s07, содержащая поток данных следующего содержания:
# r:\*
d 1939-09-01
t Вторжением немецких войск в Польшу началась 2-я мировая война.
l Германия Польша 2МВ
\*
d 1939-09-03
/t 1939, 3 сентября Англия и Франция объявили войну Германии, однако военной поддержки Польше не оказали.

Пример значения элемента с несколькими строками, включая пустые.
//
l Германия Англия Франция 2МВ
\*
d 1939-09-05
t 1939, 5 сентября США объявили о своем нейтралитете в европейской войне.
l США 2МВ
\*
d 1939-09-17
t Вторжение советских войск в Польшу.
l Польша Россия СССР
\*
d 1939-09-28
t Раздел Польши между Германией и СССР.
l Польша Германия Россия СССР
\*
d 1939-11
/t 1939, ноябрь — 1940, март Советско-финляндская война. Завершилась мирным договором, установившим новую государственную границу на советских условиях.

Пример значения элемента с несколькими строками, включая пустые.
//
l Россия СССР Финляндия
\*
d 1940-04-09
t Немецкие войска вторглись в Данию и Норвегию.
l Германия Дания Норвегия 2МВ
\*
d 1940-05-10
t Немецкие войска вторглись в Бельгию, Нидерланды и Люксембург.
l Германия Бельгия Голландия 2МВ
\*
d 1940-05-10
t Премьер-министром Великобритании назначен Уинстон Черчилль.
l Англия
\*
d 1940-05-20
t Немецкие танковые соединения вышли к Ла-Маншу, отрезав в Бельгии и Северной Франции крупную группировку англо-французско-бельгийских войск.
l Германия Англия Франция 2МВ
\*
Разметка
~a=mszzp("d:*~s07")
@vmt(a)
Вывод
d
t
l
0
1939-09-01 Вторжением немецких войск в Польшу началась 2-я мировая война. Германия Польша 2МВ
1
1939-09-03 1939, 3 сентября Англия и Франция объявили войну Германии, однако военной поддержки Польше не оказали.

Пример значения элемента с несколькими строками, включая пустые.
Германия Англия Франция 2МВ
2
1939-09-05 1939, 5 сентября США объявили о своем нейтралитете в европейской войне. США 2МВ
3
1939-09-17 Вторжение советских войск в Польшу. Польша Россия СССР
4
1939-09-28 Раздел Польши между Германией и СССР. Польша Германия Россия СССР
5
1939-11 1939, ноябрь — 1940, март Советско-финляндская война. Завершилась мирным договором, установившим новую государственную границу на советских условиях.

Пример значения элемента с несколькими строками, включая пустые.
Россия СССР Финляндия
6
1940-04-09 Немецкие войска вторглись в Данию и Норвегию. Германия Дания Норвегия 2МВ
7
1940-05-10 Немецкие войска вторглись в Бельгию, Нидерланды и Люксембург. Германия Бельгия Голландия 2МВ
8
1940-05-10 Премьер-министром Великобритании назначен Уинстон Черчилль. Англия
9
1940-05-20 Немецкие танковые соединения вышли к Ла-Маншу, отрезав в Бельгии и Северной Франции крупную группировку англо-французско-бельгийских войск. Германия Англия Франция 2МВ
В данном примере разделителем блоков данных назначена комбинация символов \*. Поэтому внутри блоков становятся допустимы многострочные тексты, включающие пустые строки.

Функция mszkk - получить ключи колонок

Функция mszkk(md) позволяет выбрать из МСЗ md все ключи колонок. Анализу подвергаются все строки, поскольку массив может быть разреженным. В следующем примере загружается массив из секции s02 данной статьи и из него выбираются все ключи колонок, имеющиеся во всех строках.
Разметка
~a=mszzt("d:*~s02")
~k=mszkk(a)
@vvt(k)
Вывод
0
1
2
3
4
5
6
rang firma strana x1 x2 x3
6

Функция mszpk - получить колонку

Функция mszpk(md,k) позволяет выбрать из МСЗ md колонку k. В следующем примере загружается массив из секции s02 данной статьи и из него выбирается колонка firma.
Разметка
~a=mszzt("d:*~s02")
~k=mszpk(a,'firma')
@vvt(k)
Вывод
0
1
2
3
4
Bank of China Wells Fargo Chevron Volkswagen Group Apple

Функция mszps - получить срез массива

Функция mszps(md,ks,kk) позволяет выбрать из МСЗ md срез, включающий строки из списка ks и столбцы из списка kk, которые могут быть массивами или строками, перечисляющими через пробелы ключи (индексы) строк/столбцов. Результатом является новый МСЗ, включающий только данные заданных строк и столбцов. В следующем примере загружается массив из секции s04 данной статьи и из него выбираются строки с индексами 11,13,15 со значениями в колонках firma,x1,x3.
Разметка
~a=mszzt("d:dok/msz.s~s04")
~x=mszps(a,'11 13 15','firma x1 x3')
@vmt(x)
Вывод
firma
x1
x3
11
Bank of China
98,1
2 034
13
Chevron
223
233
15
Apple
165
196

Функция mszvm - вывести срез массива

Функция mszvm(md,ks,kk) позволяет вывести из МСЗ md срез, включающий строки из списка ks и столбцы из списка kk, которые могут быть массивами или строками, перечисляющими через пробелы ключи (индексы) строк/столбцов. В следующем примере загружается массив из секции s04 данной статьи и из него выводятся строки с индексами 11,13,15 со значениями в колонках firma,x1,x3.
Разметка
~a=mszzt("d:dok/msz.s~s04")
@mszvm(a,'11 13 15','firma x1 x3')
Вывод
firma
x1
x3
11
Bank of China
98,1
2 034
13
Chevron
223
233
15
Apple
165
196

Функция mszuo - условный отбор строк

Функция mszuo(md,uo,p) позволяет выбрать из МСЗ md коды ключей строк, удовлетворяющих критериям, задаваемым uo, и интерпретируемым в соответствии с правилами, установленными p. Критерии в параметре uo задаются массивом или строкой правилами ключ:значение, где ключ - это имя колонки, а значение - последовательность символов. Каждому критерию удовлетворяют только те строки, в которых значение в соответствующей колонке либо полностью совпадает со значением критерия, либо совпадает с ним по части первых символов длиной со значение критерия. Условия применения каждого критерия по отдельности и всей их совокупности регулируются данными, заданными в параметре p функции mszuo(). Параметр p - это массив или строка, содержащая данные в формате ключ:значение. Регулирующими параметрами являются:
s - полное (1) или неполное (0) соответствие значения к колонке критерию;
v - выполнение всех (1) или хотя бы одного (0) критерия.
Если s=1, то строка удовлетворяет критерию, если значение элемента в соответствующей колонке в точности равно его значению. Если s=0, то проверяется только совпадение первых символов элемента с критерием. Если v=1, то строка отбирается только тогда, когда все критерии выполнены. Если v=0, то строка отбирается, если выполнен хотя бы один из установленных критериев. По умолчанию s=0, v=1.
В данной статье имеется секция s08 следующего содержания:
# rk:$p
@ p1 p2 p3 p4
aa x1 100 200
ab x2 300 400
ba x1 100 500
bb x2 600 100
aa x2 200 400
ab x1 200 400
~x=mszzt("d:dok/msz.s~s08")
@vmt(x)
Вывод
p1
p2
p3
p4
0
aa x1
100
200
1
ab x2
300
400
2
ba x1
100
500
3
bb x2
600
100
4
aa x2
200
400
5
ab x1
200
400
Рассмотрим различные варианты выборки данных из созданного на её основе массива х.
Один критерий, строгое соответствие
~y=mszuo(x,'p1:aa','s:1')
@vvt(y)
Вывод
0
1
0
4
Один критерий, не строгое соответствие
~y=mszuo(x,'p1:a','s:0')
@vvt(y)
Вывод
0
1
2
3
0
1
4
5
Два критерия, не строгое соответствие, все критерии должны выполняться
~y=mszuo(x,'p1:a p2:x1','s:0 v:1')
@vvt(y)
Вывод
0
1
0
5
Два критерия, не строгое соответствие, хотя бы один критерий должен выполняться
~y=mszuo(x,'p1:a p2:x1','s:0 v:0')
@vvt(y)
Вывод
0
1
2
3
4
0
1
2
4
5

Пополняемые массивы структурированных записей

Рассмотренные ранее функции mszzt() и mszzt() могут создавать МСЗ только из одного источника данных. Если же требуется создать МСЗ из нескольких источников, то необходимо применить иной подход, основанный на использовании пополняемых МСЗ. Он предполагает предварительное создание МСЗ функцией mszso() и его последующее наполнение из последовательности источников, которые могут быть как табличными, так и потоковыми, с помощью функций mszdt() и mszdp(). Дальнейшее манипулирование данными массива осуществляется теми же рассмотренными ранее функциями, но вместо обычного массива в них должен передаваться идентификатор пополняемого массива, возвращённый функцией mszso().

Функция mszso - создание пополняемого массива структурированных записей

Функция mszso() создаёт пополняемый массив структурированных записей. Она не имеет параметров и возвращает идентификатор созданного объекта, который в последующем должен использоваться при обращениях к нему из других функций

Функция mszdt - добавить таблицу

Функция mszdt(p,md) позволяет дополнить ранее созданный пополняемый МСЗ новыми данными из источника, определяемого параметром p. Содержимое источника, загружается, интерпретируется как табличные данные, которые должным образом преобразуются и дополняют массив md новыми строками. Правила преобразования полностью идентичны тем, которые были описаны при рассмотрении функции mszzt(). При дополнении неидентифицированные строки становятся новыми строками массива, а идентифицированные либо присоединяются (если нет строки такими же ключами), либо замещают строки с теми же ключами. Рассмотрим примеры.
Сначала создаём пополняемый массив сохраняем его идентификатор в переменной i:
~i=mszso()
Загружаем в массив секцию s03:
@mszdt("d:*~s03",i)
@mszvm(i)
Дополняем массив данными из секции s05, имеющей следующее содержание:
@ rang firma strana x1 x2 x3 x4
290;Cigna;United States;29.1;1.6;53.7;17.9
291;Rolls-Royce Holdings;United Kingdom;19.8;3.7;28.9;30.7
292;State Street;United States;10.1;2.1;222.6;27.4
292;Ericsson;Sweden;35;0.9;40.4;44.1
294;CNP Assurances;France;53.2;1.2;466.1;9.9
295;SingTel;Singapore;15;3.2;31.4;45.7
@mszdt("d:*~s05",i)
@mszvm(i)
Далее все остальные функции могут использоваться точно также, как было рассмотрено ранее с тем отличием, что в них вместо собственно массива должен передаваться его идентификатор, полученный от функции mszso().
~k=mszkk(i)
@vvt(k)
~k=mszpk(i,'strana')
@vvt(k)
~x=mszps(i,'1 3 5 7','firma x1 x3')
@vmt(x)
~y=mszuo(i,'strana:Uni','s:0 v:1')
@vvt(y)

Функция msz - загрузить данные нескольких источников одним вызовом

Функция msz(sud[,p]) позволяет одним действием создать массив структурированных данных сразу из нескольких однородных источников (таблиц или потоков). Параметр sud - это массив или строка, содержащие список указателей на загружаемые данные. Если параметр p не задан, то все источники данных считаются табличными. Если нужно загрузить несколько потоков данных, то параметр p следует задать в форме: "t:p".
Секция msz статьи dok/la.s содержит следующие данные готовые к трансформации в массив структурированных записей.
# rk:$p
@ x1  x2   y
118  106  203
102   50   88
116   54  110
124   42   56
114   36   80
154  106  237
115   88  160
 98   46   75
Для включения этих данных в массив, используемый в данной статье, проще всего применить функцию msz().
Разметка
~a=msz("d:dok/la.s~msz")
@vmt(a)
Вывод
x1
x2
y
0
118
106
203
1
102
50
88
2
116
54
110
3
124
42
56
4
114
36
80
5
154
106
237
6
115
88
160
7
98
46
75
Оцените публикацию по предложенной шкале
-5  -4  -3  -2  -1  0  +1  +2  +3  +4  +5

Статистика Код