AWK preprocess CSV

Um Daten in einer lokalen mongodb zum spielen zu haben, dachte ich mir, importiere doch mal die Kontobewegungen vom letzten Jahr. Schön das meine Bank einen CSV-Export anbietet. Nicht so schön, dass es eine Semikolon getrennte CSV-Datei ist. Und das das Zahlenformat nicht ganz momgodb kompatibel ist. Achja, sie ist nicht UTF8 codiert1.

Bis ich herausgefunden habe wie - und ob überhaupt, mongodbimport bzw. mongodb mit DE Zahlenformat umgehen kann, bereite ich die Datei zum Import einfach mal vor.

Zuerst dachte ich an ein kleines Go Programm, aber dann bin ich doch bei AWK gelandet.

awk -F";" -v OFS=',' 
'NR==1 {print $1,$2,$3,"\"Auftraggeber\"",$5,$6,$7,"\"Betrag\"";next;}
 $5 == "\"Tagessaldo\"" {next;} 
 NR>1 {gsub(/\./,"",$8);gsub(/,/,".",$8);print $1,$2,$3,$4,$5,$6,$7,$8; }'
  • Option -F definiert den Feldtrenner.
  • Option -v setzt die Variable OFS (Output Field Seperator). D.h. werden Felder ausgegeben, wird OFS mit ausgegeben. Ohne diese Variable müsste man print $1, “,” , $2 schreiben.
  • NR (Number Record) ist mehr oder weniger die Zeilennummer.

Mit diesem AWK Aufruf ändere ich die Header Zeile. Überspringe alle Tagessaldo Einträge, entferne beim Betrag den Tausender-Punkt und danach wird das Komma noch durch einen Punkt ersetzt.

Die Datei enthält mehr Spalten, deshalb doch einzeln aufgeführt. Zudem würde ein print ohne Angabe zwar auch ‘,’ als Feldtrenner ausgeben, aber es wurde immer noch ein ‘,’ ans Ende gesetzt. Was dann zu einem leeren Feld geführt hatte.

So kann mongoimport die Datei sauber importieren. Der Betrag ist dann zwar noch kein NumberDecimal, aber ich wollte ja auch ursprünglich in mongodb spielen.


  1. iconv -f iso-8859-1 -t utf-8 < export.csv > export.utf8.csv ↩︎