Germany | Finland | Saint Petersburg | Drive

Файловые операции с массивами и коллекциями

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

В процессе создания программ на языке QPILE нередко возникает задача сохранения каких-либо переменных на диске. Это необходимо, например, при обмене данными между различными портфелями или при сохранении информации между последовательными итерациями одного портфеля.

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

Очень муторно, исходный текст разбухает на глазах. Но самое главное - способ не универсален. Каждый раз придется писать две довольно объёмные функции, одна из которых в нужном порядке сохраняет данные, другая в том же порядке их считывает. Изменив что-то в одной, придется обязательно исправлять вторую. Однажды пройдя через такую процедуру, решил написать универсальный механизм для будущего использования.

Как известно, все агрегатные данные в QPILE - массивы ии коллекции фактически представляют из себя строки. Почему бы просто не сохранять данные этих типов как строки? Простейший тест - создаем ассоциативный массив, пишем его в файл, потом читаем из файла и сравниваем с оригинальным. Результат - совпадают. Для коллекции результат не менее положительный (с чего бы ему таковым не быть?).

Функции были написаны. В процессе использования  выяснилась проблема. Дело в том, что из QPILE можно записать в файл строку (практически) любой длины, а вот прочесть можно только 1 килобайт. Почему? Таково природное свойство интерпретатора - вопрос к разбработчикам. Придется и это ограничение обойти путем разбиения длинной строки на части. В результате вот пара функций:

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Сохранение коллекции или ассоциативного массива в файл
' Преодоление ограничения qpile на 1000 символов в одной строке
' При успешном завершении возвращается пустая строка, при ошибке строка с диагностикой системы
FUNC Save_Object(so_FileName,so_Object)
clear_file(so_FileName)
for so_count from 0 to len(so_Object) - 1
              result = writeln(so_fileName,substr(so_Object,so_count,1000))
              if 0+get_value(result,"RESULT") = 0
                            result = get_value(result,"DESCRIPTION")
                            return
              end if
              so_count = so_count+999
end for
result = ""
END FUNC

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Чтение объекта из файла. Возвращает ассоциативный массив
' RESULT - содержимое файла (объект)
' ERROR - код ошибки. 0 - успешно, 1 – ошибка
FUNC Read_Object(ro_FileName)
            ro_string = ""
            result = 0
            ro_size = get_file_len(ro_FileName)
            for so_count from 1 to ro_size
                    ro_string = ro_string & read_line(ro_FileName,so_count,result)
                    if result > 0
                                 result = set_value(create_map(),"ERROR",result)
                                 return
                   end if
           end for
           result = set_value(create_map(),"RESULT",ro_string)
END FUNC

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

 Если требуется передать данные из внешней программы, написанной на ином языке, то коллекция/массив должны быть сформированы ей в соответствии с форматом языка qpile, а функцией Read_Object читать его портфелем.

 

См. также 

Добавить комментарий