Umsteiger Lexware -> Hibiscus

Wie ich meine Daten umzog // Update: Script mit Übernahme der Kategorien erweitert

 
Flo-63
Neuling
Avatar
Geschlecht: keine Angabe
Beiträge: 1
Dabei seit: Gestern
Betreff:

Umsteiger Lexware -> Hibiscus

 · 
Gepostet: Gestern um 16:50 Uhr  ·  #1
Hallo zusammen,

nachdem ich mich aus gegebenem Anlass entschlossen habe, alles aus Redmond von meinem Rechner zu entfernen, stellte sich die Frage, wie ich das letzte Windows-Only Programm (Lexware FM 2025) in der Linux Welt ersetzen kann. Die Wahl viel schnell auf Jameica/Hibiscus (CHAPEAU für das Projekt!!), allerdings stellte sich die Datenübernahme als eher knifflig heraus. Der Export aus Finanzmanager ging nur als ".qif" Datei.
Ich habe die Konvertierung in ein CSV erstmal mit den üblichen Command Line Tools versucht, dann mit dem Umweg über gnucash - was aber alles eher semi-gute Ergebnisse liefert.
Daher habe ich mir ein Shell Script gebaut, was direkt aus dem exportierten .qif ein .csv baut, was ohne Probleme (Umlaute, Verwendungszweck, Datum,...) importiert werden kann. So habe ich die aus mehreren Konten in summe über 20000 Buchungssätze sauber umgezogen wobei ich die Kategorien der Buchungen nachträglich eingepflegt habe.

Hier das Script inkl. Übernahme der Kategorien, falls jemand einmal eine ähnliche Herausforderung hat.

Code

#!/bin/bash

# Standard-Zielformat ist DMY (Tag.Monat.Jahr)
TARGET_FORMAT="DMY"

# CLI Parameter Check
while [[ "$#" -gt 0 ]]; do
    case $1 in
        --target) TARGET_FORMAT="$2"; shift ;;
        *) if [ -z "$INPUT" ]; then INPUT="$1"; elif [ -z "$OUTPUT" ]; then OUTPUT="$1"; fi ;;
    esac
    shift
done

if [ -z "$INPUT" ] || [ -z "$OUTPUT" ]; then
    echo "Nutzung: $0 [--target DMY|MDY] <input.qif> <output.csv>"
    echo "Standard-Zielformat ist DMY (für Hibiscus Deutschland)."
    exit 1
fi

echo "Verarbeite $INPUT (Zielformat: $TARGET_FORMAT)..."

perl -pe 's/\r\n|\n|\r/\n/g' "$INPUT" | \
iconv -f CP1252 -t UTF-8//TRANSLIT | \
tr -cd '\11\12\15\40-\176\200-\377' | \
perl -Mutf8 -CS -s -ne '
    BEGIN {
        $detected_mode = "MDY"; # Default-Annahme bei Fehlen der Option
    }

    # 1. Options-Zeile auswerten, falls vorhanden
    if (/^\!Option:(MDY|DMY)/) {
        $detected_mode = $1;
    }

    # 2. Datum extrahieren und Format-Check
    if (/^D\s*(\d+)\.(\d+)\.(\d+)/) {
        my ($val1, $val2, $year) = ($1, $2, $3);

        # Automatische Erkennung: Wenn eine Zahl > 12 ist, ist das der Tag.
        if ($val1 > 12) { $detected_mode = "DMY"; }
        elsif ($val2 > 12) { $detected_mode = "MDY"; }

        # Konvertierung ins Zielformat
        if ($target eq "DMY") {
            if ($detected_mode eq "MDY") { ($day, $month) = ($val2, $val1); }
            else { ($day, $month) = ($val1, $val2); }
        } else {
            if ($detected_mode eq "DMY") { ($month, $day) = ($val2, $val1); }
            else { ($month, $day) = ($val1, $val2); }
        }
        $d = sprintf("%d.%d.%02d", $day, $month, $year);
    }
    elsif (/^T\s*([-0-9.,]+)/) { $t = $1; $t =~ s/,//g; }
    elsif (/^P\s*(.*)/) { $p = $1; }
    elsif (/^L\s*(.*)/) { $l = $1; }
    elsif (/^M\s*(.*)/) { $m = $1; }
    elsif (/^\s*\^/) {
        if ($d && $t) {
            for ($p, $m) { s/^\s+|\s+$//g if $_; s/;/ /g if $_; }
            # Text-Kürzung für Hibiscus (max 255 Zeichen)
            $m = substr($m, 0, 250) . "..." if (defined $m && length($m) > 255);
            $p = substr($p, 0, 250) . "..." if (defined $p && length($p) > 255);
            print "$d;$t;$p;$m;$l\n";
        }
        $d=$t=$p=$m=$l="";
    }
' -- -target="$TARGET_FORMAT" > "$OUTPUT"

echo "Fertig! CSV wurde erstellt."


Bei Fragen gerne melden...

Danke an Olaf Willuhn!!
hibiscus
Benutzer
Avatar
Geschlecht: keine Angabe
Herkunft: Leipzig
Homepage: willuhn.de/
Beiträge: 11416
Dabei seit: 03 / 2005
Betreff:

Re: Umsteiger Lexware -> Hibiscus

 · 
Gepostet: Gestern um 20:55 Uhr  ·  #2
Danke für das Veröffentlichen des Scripts!
Gewählte Zitate für Mehrfachzitierung:   0