Germany | Finland | Saint Petersburg | Drive

Список названий полей ассоциативного массива

Опубликовано в QPILE

В QPILE имеется 2 вида агрегатных данных - ассоциативный массив и коллекция. Пробежаться по всем элементам коллекции просто - нужно перебрать все ее значения  от начального до последнего. А можно ли это сделать со всеми элементами ассоциативного массива?

Да. Можно. Причем это можно сделать для ассоциативного массива произвольной структуры.

Ассоциативный массив в QPILE имеет представление в виде текстовой строки с символьными разделителями. Зная структуру представления ассоциативного массива разобрать его структуру не представляет труда. Вот текст простейшего портфеля, который иллюстрирует происходящее.

Сначала просто создадим ассоциативный массив любой структуры, после чего найдем в нем все названия полей. Я создал массив из двух полей. Можно создать любой, в том числе содержащий в качестве полей другие массивы или коллекции. Ассоциативный массив получил имя a.

 

PROGRAM

a = create_map()
a = set_value(a,"AAA",1)
a = set_value(a,"BBB","xxx")

' А сейчас находим все поля в ассоциативном массиве и выводим их в файл

for stx from 0 to stx
         result = find(a,stx,"=SOH")
         if result == -1
               break
         end if
         result = substr(a,stx,result-stx)
         if get_value(a,result) != ""
                writeln("t.txt",result)
         end if
         stx = find(a,stx,"STX")
end for
END_PROGRAM 

Что за символы такие SOH и STX, что выделены фоном? Это символы - разделители, которые используются в формате хранения. Они имеют коды соответственно 01 и 02. Обычным способом их с клавиатуры ввести невозможно. Чтобы их указать, небходимо при нажалой клавише Alt на дополнительной цифровой клавиатуре нажать последовательно кнопки 0 и 1 для символа SOH, для символа STX - 0 и 2. При этом нужно использовать текстовый редактор, который эти символы не станет фильтровать. Я использую Notepad++. В других редакторах эти символы могут отображаться в виде рожиц ( белой и чёрной) или как-то иначе. В результате выполнения нашего портфеля в файле T.TXT будут находиться 2 строки AAA и BBB - названия полей исходного ассоциативного массива. При желании на основании этого примера нетрудно написать функцию, которая бы возвращала в той или иной форме (список / массив / коллекция)  ключи исходного ассоциативного массива.

Комментарии   
# Камынин 09.03.2012 11:27
Так лучше:
Вместо: result = find(a,stx,"=SOH")
пишем result = find(a,stx,"SOH ")
вместо: result = substr(a,stx,re sult-stx)
пишем : result = substr(a,stx,re sult-stx-1)
Ответить | Ответить с цитатой | Цитировать
# admin 16.03.2012 13:50
Николай, я бы не советовал. Иногда могут быть проблемы.
Ответить | Ответить с цитатой | Цитировать
Добавить комментарий