Base/Calc: externe Datenquellen dynamisch integrieren (vergleichbar mit Power Query in Excel)

Betriebssystem: Linux Mint 22.2 Zara – LibreOffice Version 24.7.72 – Neuling bei Linux und LibreOffice

Hallo,

ich habe gesucht und mehrere Beiträge gelesen, die sich entweder mit Power Query-Funktionen für LibreOffice oder mit der Verknüpfung externer Datenquellen befassen. Allerdings habe ich keine echte Antwort auf meine Frage gefunden, daher stelle ich sie hier:

  • Ich erhalte aus einem System autmatisiert und häfuig (mehrmals am Tag) *.csv-Dateien mit genau der gleichen Struktur in einem freigegebenen Verzeichnis.

  • Ich möchte eine Abfrage/Tabelle, die dieses Verzeichnis (alle Dateien – einschließlich neu hinzugefügter!) beim Aufruf abfragt, sich aktualisiert und die konsolidierten Daten in leicht veränderter Form (Spalten ausgeblendet und neu angeordnet) anzeigt.

  • Ich bin mir nicht sicher, ob es besser ist, Calc oder Base zu verwenden und wie ich anfangen soll. Ich habe bereits einige Versuche unternommen, aber nichts hat so funktioniert, wie ich es mir vorgestellt habe, oder – was wahrscheinlicher ist – ich habe es nicht wirklich verstanden.

  • In Excel habe ich zu diesem Zweck mit Power Query eine Abfrage in einer Tabelle erstellt – diese Abfrage aktualisiert sich auf Knopfdruck, blendet unnötige Inhalte aus und ordnet die verbleibenden Spalten so an, wie ich es möchte.

Viele Grüße und ich freue mich auf einen spannenden Austausch hier im Forum – leider werde ich am Anfang wahrscheinlich viel „nehmen” und erst mittelfristig etwas „zurückgeben” können.

Gruß

Crossposting:

1 Like

Und soweit war ich bisher im englischen Forum:

  1. Mit den GNU Core Utilities sollte es möglich sein, Abfragen über mehrere gleich strukturierte Textdateien zu durchzuführen. 30 Jahre alte Bordmittel, simpel, effizient, aber zunächst mal unkomfortabel.
  2. Mit Calc oder Base müsste man die Textdateien erst zu einer Tabelle zusammenfassen. Apache OpenOffice Community Forum - Merge sheets of spreadsheet documents - (View topic) sollte das mit Calc hinbekommen.
  3. Für Base kenne ich 2 Arten, Textdateien zu verarbeiten:
    3.1. Der eingebaute Datenbanktreiber für Textdateien erscheint mir hier untauglich. Er würde zwar alle Textdateien als Tabellen auflisten, erlaubt aber nur maximal simple Abfragen über eine Tabelle.
    3.2. HSQL ist eine Datenbank, die Textdateien als Datenbanktabellen einbinden kann. Auch hier macht es die Sache einfacher, wenn man neue Textdateien in einer Gesamttabelle vereinigt und dann die Abfrage über diese Tabelle laufen lässt (anstelle von UNION SELECT über eine wachsende Zahl von Tabellen).

Ich habe hier ein simples Makro für das folgende Szenario:

  • Eine neue Textdatei landet in einem Ordner.
  • Ich fische die neue Datei mit einem Dialog aus dem Ordner.
  • Die Verknüpfung der DB zu einer bestehenden Textdatei wird getrennt.
  • Die bestehende Textdatei wird durch die neue ersetzt.
  • Die Verknüpfung der DB zur Textdatei wird wieder hergestellt.
  • Ein SQL-Statement importiert alle Daten in der richtigen Spaltenfolge, mit den richtigen Datentypen und ohne Duplikate aus der verknüpften Textdatei in eine Datenbanktabelle.

Die Hauptarbeit wird nicht vom Makro-Code erledigt, sondern mit SQL, das genau für sowas vor 50 Jahren erfunden wurde. Das funktioniert hier sogar mit Buchungsdaten verschiedener Banken, die korrekt in dieselbe Tabelle importiert werden. Das Ergebnis erlaubt detaillierte Auswertungen über hunderttausende Datensätze aus 16 Jahren.
Und wie bei 99% aller csv-Fragen

Noch was: Du hast im englischen Forum angedeutet, dass Du das Ausgabeformat der csv-Dateien anpassen kannst. Also könnte es doch eventuell möglich sein, den ganzen csv-Quark wegzulassen und direkt auf die Datenbank zuzugreifen, oder? Auf der anderen Seite, hättest Du das auch schon unter Windows haben können.

Benutze zum Beispiel Menüpunkt Externe Verknüpfungen im Menu Tabelle. Dort hast du direkt ein Eingabefeld für die URL. Nach der Eingabe der URL musst du etwas warten bis die Daten geladen sind. Dann erhältst du den übliche Textimport-Dialog. Mache dort die nötigen Einstellung. OK. Nun bist du zurück im Externe Daten-Dialog. Dieser Dialog hat sogar eine Checkbox mit der du eine automatische Aktualisierung einschalten kannst. Du kannst aber auch später über Menü Bearbeiten > Verknüpfung zu erxternen Dateien die Verknüpfung manuell aktualisieren. Bei diesem Vorgehen wird kein neues Tabellenblatt angelegt. Trotzdem solltest du die Auswertungen auf einem anderen Tabellenblatt machen, damit beim Aktualisieren nichts von deinen Berechnungen überschrieben wird.


Die Auswertung wird nicht direkt beim Import gemacht, sondern das musst du anschließend einrichten. Zum Ausblenden und neu Anordnen von Spalten steht dir die Funktion SPALTENWAHL zur Verfügung. Die gibt es allerdings noch nicht so lange. Du brauchst also eine ganz aktuelle Version von LibreOffice.

Er braucht aber Abfragen über mehrere Textdateien hinweg.

Außerdem haben fast alle Calc-Verknüpfungen den Makel, dass sie nicht aktualisierbar sind, ohne dass Referenzen verloren gehen, weil das Prinzip “Zeilen löschen und einfügen” nicht angewandt wird.
Eben genau dies:

Das Problem ist zum einen, dass Inhalte überschrieben werden können und zum anderen, dass keine Bezüge automatisch an die Größe des neuen Datensatzes angepasst werden.
Verknüpfte Datenbankbereiche sind in dieser Hinsicht sehr viel besser für dynamische Auswertungen geeignet. Leider muss man dabei für jede Verknüpfung sinnlose Standardeinstellungen ändern, um in den Genuss der Vorteile zu kommen.
https://bugs.documentfoundation.org/show_bug.cgi?id=163192

1 Like

Ich hatte übersehen, dass seine Dateien schon in einem Verzeichnis liegen. In einem solchen Fall ist der Weg über eine odb-Datei und den Import in einen Datenbankbereich sicher richtig.

Naja, dabei gibt es einen naheliegenden Weg, der aber in die Irre führt. Ich meine die Verknüpfung eines Datenbankdokumentes mit dem Text-Treiber. Du bist dann wieder mit einer wachsenden Zahl von Datenbankbereichen konfrontiert, um dann in Calc Abfragen über mehrere Bereiche machen zu können. Jeder dieser Datenbankbereiche hat seine eigene Kopfzeile mit Spaltenbeschriftungen. Und wenn Du viele solcher Import-Bereiche untereinander setzt muss auch immer eine Leerzeile dazwischen sein und besagte Option für “Zeilen einfügen/entfernen” muss bei jedem Bereich manuell gesetzt werden. Das ist alles Moppelkotze.

Für mich persönlich ist der Textimport nach HSQL, MySQL oder ähnlichen Datenbanken alternativlos. Firebird scheint das nicht zu können (oder ich kann es nicht mit Firebird).

Mein vorgeschlagenes Makro kann das ganz ordentlich auch mit Calc erledigen, vorausgesetzt man setzt die Import-Parameter richtig. Jedenfalls habe ich positives Feedback für das Machwerk.

Beim Rumspielen mit Gnu Core Utils bin ich so weit gekommen::

tail -n +2 *Buchungsliste*.csv |grep -v '^==>' | sort | uniq > merge.csv

Das öffnet Dateien mit Buchungsliste*.csv unterhalb der Kopfzeilen, entfernt die ==> Tags, die auf den Dateiursprung hinweisen, sortiert die Zeilen, löscht Duplikate und schreibt alles in die Datei merge.csv.
Die Datumswerte, Dezimalzahlen Spaltenfolgen, die Textcodierung und was nicht alles ist dabei noch gar nicht berücksichtigt.

Das scheint nicht an Dir zu liegen, aber da gäbe es wohl etwas von …

Das CLI für sqlite beherrscht csv-Import auch gut und mit skip 1 parameter beim .import kann man die Header-Zeilen gleichartiger csv-Dateien überspringen.