Libreoffice basic - Ассоциативный массив

Я родом из PHP / JS / AS3 / ... такого рода языков. Теперь я изучаю основы Libreoffice и пытаюсь найти что-то похожее на ассоциативный массив, который я использую для других языков.

Я пытаюсь создать такую ​​структуру:

2016 => Октябрь => afilename.csv

2016 => апрель => другое имя_файла.csv

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

Спасибо!


person Xue Fang    schedule 11.05.2016    source источник


Ответы (3)


Как сказал @Chrono Kitsune, Python и Java имеют такие функции, а Basic - нет. Вот пример Python-UNO для LibreOffice Writer:

def dict_example():
    files_by_year = {
        2016 : {'October' : 'afilename.csv',
                'November' : 'bfilename.csv'},
        2017 : {'April' : 'anotherfilename.csv'},
    }
    doc = XSCRIPTCONTEXT.getDocument()
    oVC = doc.getCurrentController().getViewCursor()
    for year in files_by_year:
        for month in files_by_year[year]:
            filename = files_by_year[year][month]
            oVC.getText().insertString(
                oVC, "%s %d: %s\n" % (month, year, filename), False)

g_exportedScripts = dict_example,

Создайте файл с приведенным выше кодом с помощью текстового редактора, такого как Блокнот или GEdit. Затем поместите его сюда.

Чтобы запустить его, откройте Writer, перейдите в Tools -> Macros -> Run Macro и найдите файл в My Macros.

person Jim K    schedule 12.05.2016

Я не знаком с LibreOffice (или OpenOffice.org) BASIC или VBA, но я не нашел ничего в документации для какого-либо ассоциативного массива, хэша или того, что еще кто-то называет.

Однако многие современные диалекты BASIC позволяют вам определять свой собственный тип как серия полей. Тогда просто нужно использовать что-то вроде

Dim SomeArray({count|range}) As New MyType

Я думаю, что это так близко, как вы могли бы получить без использования сторонних библиотек. Возможно, поможет мост Python-UNO, поскольку в Python есть такая функция ( словари), но я бы не знал наверняка. Я также не знаю, как это повлияет на производительность. Вы можете предпочесть Java вместо Python для взаимодействия с UNO, и это тоже нормально: есть _ 2_ типа. Извините, я ничем не могу помочь, но важно помнить, что любой код BASIC имеет тенденцию соответствовать значению слова «базовый» на английском языке без внешней помощи.

person Community    schedule 12.05.2016

Этот вопрос задавали давно, но ответы верны только наполовину.

Это правда, что LibreOffice Basic не имеет собственного типа ассоциативного массива. Но API LibreOffice предоставляет услуги. Служба com.sun.star.container.EnumerableMap удовлетворит ваши потребности.

Вот пример:

' Create the map
map = com.sun.star.container.EnumerableMap.create("long", "any")

' The values
values = Array( _
    Array(2016, "October", "afilename.csv"), _
    Array(2016, "April", "anotherfilename.csv") _
)

' Fill the map
For i=LBound(values) to UBound(values)
    value = values(i)
    theYear = value(0)
    theMonth = value(1)
    theFile = value(2)
    If map.containsKey(theYear) Then
        map2 = map.get(theYear)
    Else
        map2 = com.sun.star.container.EnumerableMap.create("string","string")
        map.put(theYear, map2)
    End If
    map2.put(theMonth, theFile)
Next

' Access to an element
map.get(2016).get("April")  ' anotherfilename.csv

Как видите, методы аналогичны тем, которые вы можете найти в более обычных языках.

Осторожно: если вы столкнулись с IllegalTypeException, вам, возможно, придется использовать CreateUNOValue("<type>", ...) для приведения значения к объявленному типу. (См. Эту очень старую проблему https://bz.apache.org/ooo/show_bug.cgi?id=121192 для примера.)

person jferard    schedule 21.03.2021