Skip to content

Instantly share code, notes, and snippets.

@derselbst
Last active October 19, 2025 12:42
Show Gist options
  • Select an option

  • Save derselbst/fd0d0529ed810434f914e9731dc53ab6 to your computer and use it in GitHub Desktop.

Select an option

Save derselbst/fd0d0529ed810434f914e9731dc53ab6 to your computer and use it in GitHub Desktop.
Moneyplex zu Finanzblick Buchungs-Import
#!/bin/bash
# Usage: ./xmlToCSV.sh input.xml > output.csv
# Requires: xmlstarlet
#
# Dieses Skript konvertiert die Buchungen von Moneyplex in ein CSV Format, welches von Finanzblick genutzt wird.
# Die alten Buchungen können so bequem in Finanzblick nachgenutzt werden.
# Splitt-Buchungen werden unterstützt und in Finanzblick als solche ausgewiesen.
# [Umbuchungen] werden zwar importiert, aber nicht als solche ausgewiesen. Stattdessen erhalten sie die Notiz "Umbuchung" und
# die Kategorie "Unkategorisiert" (gerne hätte ich Schlagworte statt Notizen verwandt, aber das funktioniert nicht zuverlässig).
#
# Vorgehensweise:
# 1. Alle Buchungen über Moneyplex als XML exportieren (mit Splittbuchungen!)
# 2. Die XML mit einem Texteditor öffnen
# a. die Kategorien händisch anpassen, siehe Info unten (optional)
# b. alle Null-Euro-Buchungen (=bei denen <BETRAG> fehlt) händisch korrigieren, durch einfügen von <BETRAG>0,00</BETRAG>
# PS: Um diese Buchungen zu identifizeren hilft: xmlstarlet sel -T -t -m "//BUCHUNG[not(BETRAG)]" -c "." -n input.xml
# c. Suchen und Ersetzen von "BLZ>" durch "BIC>"
# d. Suchen und Ersetzen von "KONTONR>" durch "IBAN>" (weil wir IBAN+BIC statt alter Kontonr.+BLZ haben wollen)
# 3. Konto in Finanzblick erstellen und Kontonamen bzw. IBAN notieren.
# 4. Variable "KontoName" unten anpassen.
# 5. xmlstarlet installieren (auf allen Linux Distros verfügbar).
# 6. Skript wie in der Usage beschrieben ausführen, unter Angabe der zuvor von Moneyplex exportierten XML (evtl. zuvor chmod +x erforderlich).
# 7. Erzeugte CSV in Finanzblick über "CSV Import" importieren.
# 8. Dabei aufpassen, dass die "Eröffnungsbuchung" in den Buchungen nun nicht zweimal enthalten ist.
#
# Info Re-Kategorisierung:
# Finanzblick erwartet eine "ParentKategorie" sowie eine "Kategorie".
# Diese sind in der XML in der Form <KATEGORIE>ParentKategorie:Kategorie</KATEGORIE> anzugeben
# Beispiel: Die Kategroie "Miete" aus Moneyplex muss händisch in
# <KATEGORIE>Wohnen:Warmmiete</KATEGORIE>
# angepasst werden. "Wohnen" ist die (vordefinierte) ParentKategorie von Finanzblick. "Warmmiete" ist irgendeine beliebig
# verschachtelte Kategorie unterhalb dessen.
# Anderes Beispiel: Zuweisung einer Moneyplex-Kategroie einer ParentKategorie direkt. "Freizeit" wird händisch angepasst zu
# <KATEGORIE>Freizeit:Freizeit</KATEGORIE>
#
# Falsch kategorisierte Buchungen sowie unbekannte Kategorien werden als "Unkategorisiert" importiert.
# Bei Online-Konten, hier die IBAN Ihres neuen Finanzblick-Import-Kontos angeben (ohne Leerzeichen).
# Bei Offline-Konten, hier den Namen des Finanzblick-Import-Kontos angeben.
KontoName="123456789"
# Nicht ändern!
delim=';'
echo "Buchungsdatum${delim}Wertstellungsdatum${delim}Empfaenger${delim}Verwendungszweck${delim}Buchungstext${delim}Betrag${delim}IBAN${delim}BIC${delim}Kategorie${delim}Konto${delim}Umbuchung${delim}Notiz${delim}Schlagworte${delim}SteuerKategorie${delim}ParentKategorie${delim}AbweichenderEmpfaenger${delim}Splitbuchung${delim}Auswertungsdatum"
xmlstarlet sel -T -t \
-m "//BUCHUNG" \
-v "normalize-space(DATUM)" -o "$delim" \
-v "normalize-space(VALUTA)" -o "$delim" \
-v "normalize-space(EMPFAENGER/NAME)" -o "$delim" \
-v "normalize-space(ZWECK)" -o "$delim" \
-o "$delim" \
-v "normalize-space(BETRAG)" -o "$delim" \
-v "normalize-space(EMPFAENGER/IBAN)" -o "$delim" \
-v "normalize-space(EMPFAENGER/BIC)" -o "$delim" \
-i "normalize-space(KATEGORIE)='[Umbuchung]'" -o 'Unkategorisiert' -b \
-i "string-length(normalize-space(KATEGORIE))=0" -o 'Unkategorisiert' -b \
-v "substring-after(KATEGORIE,':')" -o "$delim" \
-o "${KontoName}${delim}" \
-o "$delim" \
-i "normalize-space(KATEGORIE)='[Umbuchung]'" -o 'Umbuchung' -b -o '' -o "$delim" \
-o "$delim" \
-o "$delim" \
-i "normalize-space(KATEGORIE)='[Umbuchung]'" -o 'Unkategorisiert' -b -v "substring-before(KATEGORIE,':')" -o "$delim" \
-o "$delim" \
-o "false$delim" \
-v "normalize-space(DATUM)" -n \
-m "SPLITT/PART" \
-v "normalize-space(ancestor::BUCHUNG/DATUM)" -o "$delim" \
-v "normalize-space(ancestor::BUCHUNG/VALUTA)" -o "$delim" \
-o "$delim" \
-v "normalize-space(ZWECK)" -o "$delim" \
-o "$delim" \
-v "normalize-space(BETRAG)" -o "$delim" \
-o "$delim" \
-o "$delim" \
-i "substring-after(KATEGORIE,':')=''" -v "normalize-space(KATEGORIE)" -b -v "substring-after(KATEGORIE,':')" -o "$delim" \
-o "${KontoName}${delim}" \
-o "$delim" \
-o "$delim" \
-o "$delim" \
-o "$delim" \
-i "contains(KATEGORIE,':')" -v "substring-before(KATEGORIE,':')" -b -o "$delim" \
-o "$delim" \
-o "true$delim" \
-v "normalize-space(ancestor::BUCHUNG/DATUM)" -n \
-b \
-n "$1"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment