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.
#!/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!!
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!!