Seite 1 von 1

ini-Datei einlesen - wie vorgehen?

Verfasst: Fr 22. Jan 2016, 22:19
von SvenKo
Hallo

Ich möchte in einer Tabelle mit mehreren Tabellenblättern Werte aus einer ini-Datei einlesen und später auch wieder in die ini-Datei schreiben.
Auf der Suche nach einem passenden Ansatz habe ich die readini und writeini Funktionen von Dannenhöfer gefunden. Und auch ein relativ gutes Beispiel für die grundsätzliche Anwendung der readini-Funktion.
Da ich aber die komplette ini-Datei einlesen muss und die Werte automatisch in den Tabellenblättern den richtigen Feldern zugeordnet werden müssen, ist mir aber noch nicht ganz klar, wie man am besten an die Sache rangeht. Es erscheint mir sehr sinnfrei jede Tabellenzeile anzuspringen und z.B. Feld X auszulesen um mir dann aus der ini-Datei nur den Wert für dieses eine Feld zu holen.
Da in der zukünftigen Tabelle durchaus bis zu 200 Felder mit zugehörigen Werten pro Tabellenblatt vorhanden sein können, wären das ziemlich viele readini-Aufrufe.
Das geht doch bestimmt auch einfacher.

Worüber muss ich mich informieren, um zumindest in einer guten Richtung zu einem Ergebnis zu kommen?


Beispieldateien anbei.
(Da man hier keine reinen *.ini-Dateien anhängen kann, musste ich die ini-Datei umbenennen in "test.ini.ods". D.h. das ".ods" kann einfach entfernt werden.)

LOo 5.0.4.2

Sven

Re: ini-Datei einlesen - wie vorgehen?

Verfasst: Mo 25. Jan 2016, 18:30
von karolus
Hallo

Wenn du nicht gerade darauf bestehst das mit vor-sintflutlichem BASIC zu lösen, gehts relativ einfach.

Python hat sogar ein Modul zum lesen und schreiben von .ini Dateien.

Code: Alles auswählen

try:
    from  configparser import ConfigParser #py3
except:
    from ConfigParser import SaveConfigParser as ConfigParser #py2

def read_ini(filepath):
    config = ConfigParser(default_section='')    
    with open(filepath) as f:
        config.read_file(f)
    return config.items()

def import_ini():
    doc = XSCRIPTCONTEXT.getDocument()
    sheets = doc.Sheets
    for key, value in read_ini('test.ini'):
        try:
            sheet = sheets.getByName( key )
            out = tuple(value.items())
            outrange = sheet.getCellRangeByPosition(0,1,1,len(out))
            outrange.setFormulaArray(out)
        except:
            pass

def export_ini():
    config = ConfigParser(default_section='')
    doc = XSCRIPTCONTEXT.getDocument()
    sheets = doc.Sheets
    for sheetname in sheets.ElementNames:
        sheet = sheets.getByName(sheetname)
        sourcerange = sheet.getCellRangeByName('A2:B10000')
        cursor = sheet.createCursorByRange(sourcerange)
        cursor.gotoEndOfUsedArea(1)
        config.add_section(sheetname)
        for key, value in cursor.FormulaArray:
            config.set(sheetname, key, value)
    with open('new_config.ini', 'w')as f:
        config.write(f)
Aktuell liest die `import_ini` aus der Datei "test.ini" und `export_ini` schreibt nach "new_config.ini" jeweils im aktuellen Arbeitsverzeichniss.( kann man noch verändern, oder mit Dateiauswahl-dialog verfeinern.)
test_mit_python.ods
(11.38 KiB) 284-mal heruntergeladen
Karolus

Re: ini-Datei einlesen - wie vorgehen?

Verfasst: Mo 25. Jan 2016, 22:57
von Makromador
Hallo,

eine kleine Hilfestellung findet sich hier: https://makromador.wordpress.com/implementierung/

Das könnte Dir evtl. weiterhelfen.

Grüße

Makromador

Re: ini-Datei einlesen - wie vorgehen?

Verfasst: Di 26. Jan 2016, 01:07
von karolus
Super -- ganz grosses Kino! :roll:

Nachdem ich mich über eine halbe Stunde durch deine 100 Zeilen kruden Code gelesen habe -- hier ist das Gegenstück in Python in fünf lesbaren Zeilen:

Code: Alles auswählen

from  configparser import ConfigParser

def read_single_value(spath, section, key):
    config = ConfigParser( )
    config.read(spath)
    return config.get(section, key)
    
 

Re: ini-Datei einlesen - wie vorgehen?

Verfasst: Di 26. Jan 2016, 23:51
von SvenKo
@Karolus
Es muss nicht unbedingt BASIC sein. Mit Python habe ich mich bisher noch nie befasst - ich werde das als Herausforderung ansehen und dies nun nachholen.
Hmm ... es scheitert schon am einfachen Aufrufen und Bearbeiten des Scriptes ... Aha! "libreoffice-script-provider-python" fehlte in meiner Installation.
Das Exportieren in die ini-Datei funktioniert nun schon mal testweise.

Dann werd ich mal fleißig $Suchmaschine bemühen für alles weitere :D

Danke ersteinmal für den hervoragenden Ansatz.



@ Makromador
Das entspricht im wesentlichen Grundprinzip dem BASIC-Script von Dannenhöfer bzw. dem von mir bereits erwähnten Beispiel.
Einzelne / Zeilenweise Abfragen sind nicht sinnvoll in meinem Fall.