CSV konvertieren für den Import in GNUCash

Wir machen das einfach mal schnell mit einem kleinen bash Skript.

Folgendes Bash Skript lokal anpassen und prüfen (Download-/Arbeitsverzeichnis, [MASTER_REC_ID, MASTER_CSV]):

#!/bin/bash

#################
# Example script: -- no warranty -- read and understand the code
# Das Skript kann CSV Rechnungen einer nicht genannten Keditkartenfirma für den GNUCash CSV Import konvertieren.
# Script: convert-lbb2transaction.bash - July/2015 Markus Neubauer (Lizenz GPL)
#################

# Downloadformat ist:
# KK_ID; Kaufdatum; Buchungsdatum; Beschreibung; nix; nix; Abhebung bzw. Einzahlung abhängig vom Vorzeichen
# Feld: 0                          1          2 3         45 6     (7)
# (Kreditkarte-Nr. - 3 Zeichen)000;16.04.2015;;07.04.2015;;;362,69
# Feld: 0              1          2          3                              45 6
# (Kreditkartennummer);26.05.2015;24.05.2015;GOOGLE *AR Labs / GOOGLE.COM/C;;;-0,99
# (Kreditkartennummer);27.05.2015;26.05.2015;GOOGLE *Perdeas / GOOGLE.COM/C;;;-1,08
# [...]

# GNUCash Import Format für die Buchungen/Transactions ist:
# Theorie: Buchungs-Datum;lfnd.Nr.; Beschreibung; Bemerkung; Konto; Einzahlung; Abhebung; Saldo;
# - Das Feld "Konto","Saldo" wird hier später nicht verwendet
# Die hier erzeugte Ausgabe erfolgt daher verkürzt und ist mit TAB's getrennt
# - es ist sicher, da dann in der Beschreibung Komma und Semikolon auftreten könnten.
# - Abhebung ~ withdrawal, Einzahlung ~ deposit
# Doof/Erschwerend ist: Anders als beim Bankkonto fehlt zur Zuordnung oft die Referenz/Bestellummer,
# daher ist das Kaufdatum wichtig! # Format: # "${value_date} ${LFDNR} ${description} ${remarks} ${deposit} ${withdrawal}"
# Anderes Beispiel:
# 2015-06-12  1  XXX Rechnung vom 12.06.2015 ZAHLUNG-LASTSCHRIFT        2,07    0
# 2015-06-09  2  Amazon EU / AMAZON.DE    Kauf 08.06.2015 Karte (Kreditkartennummer)    0    6,98 # [...]
# change to the download directory cd "/DEIN DOWNLOAD VERZEICHNIS" || { echo "You should do some modification before usage..." exit 1 } MASTER_CSV="Kreditkartenabrechnung-*.csv" # so sollte der Download Name beginnen # here we go for DL_FILE in ${MASTER_CSV} do # no such file? [ "${DL_FILE}" == "${MASTER_CSV}" ] && continue OUT_FILE="gc-import-lbb-${DL_FILE#*-}.tab" # ignore file if conversion file already exists # - remove it if you want to have it redone [ -f "${OUT_FILE}" ] && continue # recode to usable format - here in DE if [ -n "`file ${DL_FILE} | grep CRLF`" ]; then recode ibmpc..lat1 "${DL_FILE}" fi MASTER_REC_ID='' LFDNR=0 while IFS=$';' read -r -a REC do [ -z "${REC[0]}" ] && continue # we do not want/need empty records # sometimes they have 7 fields, then the amount is found towards right if [ -n "${REC[7]}" ]; then # shift backward to amount REC[6]=${REC[7]} fi [ -z "${REC[6]}" ] && continue # no amount to book at all
# nicht mehr gültig seit Anfang 2016 #if [ -z "${MASTER_REC_ID}" ]; then # # file starts with account record, not transaction # MASTER_REC_ID="${REC[0]}" #fi # make a proper ISO date (comes for Germans here) value_date="${REC[1]:6:4}-${REC[1]:3:2}-${REC[1]:0:2}" # is it a negative amount record? if [ "${REC[6]##*-}" != "${REC[6]}" ]; then # Vorzeichen und Spaltenwechsel deposit=0 withdrawal=`printf '%7.2f' ${REC[6]##*-}` else deposit=`printf '%7.2f' ${REC[6]}` withdrawal=0 fi if [ "${MASTER_REC_ID}" == "${REC[0]}" ]; then # CC account booking remarks="" if [ $deposit != "0" ]; then description="LBB Rechnung vom ${REC[2]} ${REC[3]}" else description="${REC[3]} vom ${REC[2]}" fi else # Single transaction record description="${REC[3]} Kauf vom ${REC[2]}, Buchung ${REC[1]}" remarks="" fi [ -f "${OUT_FILE}" ] || echo "${OUT_FILE} wird neu erstellt." LFDNR=$(($LFDNR + 1)) # GC Import: Datum; Nr; Beschreibung; Bemerkung; Einzahlung; Abhebung; echo -e "${value_date}\t${LFDNR}\t${description}\t${remarks}\t${deposit}\t${withdrawal}" >> "${OUT_FILE}" done < "${DL_FILE}" done ## eof

TIPP: Die erzeugte Ausgabe Datei endet auf *.csv.tab - als kleiner Hinweis für den Import.