Bitte wähle nachfolgend aus, welche Beiträge auf dieser Themenseite auf dem Ausdruck ausgegeben werden sollen. Um dies zu tun markiere bitte die Checkbox auf der linken Seite der Posts, die im Ausdruck berücksichtigt werden sollen und klicke anschließend ganz unten auf der Seite auf den Button "Drucken".

Umsteiger Lexware -> Hibiscus

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

Flo-63

Betreff:

Umsteiger Lexware -> Hibiscus

 ·  Gepostet: Gestern um 16:50 Uhr  ·  #184791
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

Betreff:

Re: Umsteiger Lexware -> Hibiscus

 ·  Gepostet: Gestern um 20:55 Uhr  ·  #184795
Danke für das Veröffentlichen des Scripts!