Xue Fang
Xue Fang

Reputation: 108

Libreoffice basic - Associative array

I come from PHP/JS/AS3/... this kind languages. Now I'm learning basic for Libreoffice and I'm kind of struggling to find how to get something similar as associative array I use to use with others languages.

What I'm trying to do is to have this kind structure:

2016 => October => afilename.csv

2016 => April => anotherfilename.csv

with the year as main key, then the month and some datas. More I try to find informations and more I confuse, so if someone could tell me a little bit about how to organise my datas I would be so pleased.

Thanks!

Upvotes: 3

Views: 2201

Answers (3)

jferard
jferard

Reputation: 8180

This question was asked a long ago, but answers are only half correct.

It is true that LibreOffice Basic does not have a native associative array type. But the LibreOffice API provides services. The com.sun.star.container.EnumerableMap service will meet your needs.

Here's an example:

' 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

As you see, the methods are similar to what you can find in more usual languages.

Beware: if you experience IllegalTypeException you might have to use CreateUNOValue("<type>", ...) to cast a value into the declared type. (See this very old issue https://bz.apache.org/ooo/show_bug.cgi?id=121192 for an example.)

Upvotes: 1

Jim K
Jim K

Reputation: 13790

As @Chrono Kitsune said, Python and Java have such features but Basic does not. Here is a Python-UNO example for 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,

Create a file with the code above using a text editor such as Notepad or GEdit. Then place it here.

To run it, open Writer and go to Tools -> Macros -> Run Macro, and find the file under My Macros.

Upvotes: 1

user539810
user539810

Reputation:

I'm not familiar with LibreOffice (or OpenOffice.org) BASIC or VBA, but I haven't found anything in the documentation for any sort of associative array, hash, or whatever else someone calls it.

However, many modern BASIC dialects allow you to define your own type as a series of fields. Then it's just a matter of using something like

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

I think that's as close as you'll get without leveraging outside libraries. Maybe the Python-UNO bridge would help since Python has such a feature (dictionaries), but I wouldn't know for certain. I also don't know how it would impact performance. You might prefer Java instead of Python for interfacing with UNO, and that's okay too: there's the java.util.HashMap type. Sorry I can't help more, but the important thing to remember is that any BASIC code in tends to live up to the meaning of the word "basic" in English without external assistance.

Upvotes: 0

Related Questions