CSV-Dateien sind das Rückgrat unzähliger Anwendungen – schlicht, offen und universell lesbar. Doch wer regelmäßig mit ihnen arbeitet, weiß, dass sie schnell zur Fehlerquelle werden können. Dieses Tutorial zeigt, wie Sie mit Bordmitteln wie AWK und cut, aber auch spezialisierten Tools wie csvtool und csvquote, selbst komplexe CSV-Dateien sicher analysieren, bereinigen und automatisiert verarbeiten.
Sie können über visuelle Programmierung, Vibe Coding oder KI sagen, was Sie wollen – am Ende bleibt die Welt voller Daten, die sich mit einfachen Mitteln in nutzbare Informationen verwandeln lassen. CSV-Dateien spielen dabei eine zentrale Rolle. In diesem Artikel finden Sie bewährte Tipps für den Umgang mit CSV-Dateien sowie ein kleines Hilfsprogramm, das auch mit fehlerhaften Datensätzen klarkommt.
CSV-Dateien sind reine Textdateien. Sie lassen sich mit cat oder more anzeigen und in jedem Editor öffnen oder bearbeiten. Der Aufbau ist simpel: Eine Datei besteht aus Datensätzen, die jeweils mehrere Felder enthalten – typischerweise Namen, Zahlen oder einfache Werte. Eine Zeile entspricht einem Datensatz, und die einzelnen Felder sind durch ein Trennzeichen – meist ein Komma – voneinander getrennt. Die erste Zeile listet üblicherweise die Spaltenüberschriften auf.
So könnte etwa eine Mitarbeiterdatei Namen, Geburtsdaten, Positionen, Gehälter und Abteilungen enthalten.
Sie können über visuelle Programmierung, Vibe Coding oder KI sagen, was Sie wollen – am Ende bleibt die Welt voller Daten, die sich mit einfachen Mitteln in nutzbare Informationen verwandeln lassen. CSV-Dateien spielen dabei eine zentrale Rolle. In diesem Artikel finden Sie bewährte Tipps für den Umgang mit CSV-Dateien sowie ein kleines Hilfsprogramm, das auch mit fehlerhaften Datensätzen klarkommt.
CSV-Dateien sind reine Textdateien. Sie lassen sich mit cat oder more anzeigen und in jedem Editor öffnen oder bearbeiten. Der Aufbau ist simpel: Eine Datei besteht aus Datensätzen, die jeweils mehrere Felder enthalten – typischerweise Namen, Zahlen oder einfache Werte. Eine Zeile entspricht einem Datensatz, und die einzelnen Felder sind durch ein Trennzeichen – meist ein Komma – voneinander getrennt. Die erste Zeile listet üblicherweise die Spaltenüberschriften auf.
So könnte etwa eine Mitarbeiterdatei Namen, Geburtsdaten, Positionen, Gehälter und Abteilungen enthalten.
Die Stärke des CSV-Formats liegt in seiner Schlichtheit und Offenheit. Jeder kann solche Dateien erzeugen oder auswerten, ganz ohne Spezialsoftware. Natürlich speichern professionelle Anwendungen wie Buchhaltungs- oder E-Commerce-Programme ihre Daten in leistungsfähigen Datenbanksystemen. Doch als universelles Austauschformat ist CSV unschlagbar: Es ist lesbar, portabel und für praktisch jedes System geeignet. Wer Daten verarbeitet, kommt an CSV also nicht vorbei.
Tücken bei der Formatierung
In der Praxis gibt es dennoch Stolperfallen. Das beginnt mit der Wahl des Trennzeichens: Nicht immer ist es ein Komma. Manche bevorzugen das Pipe-Symbol "|", andere verwenden Tabulatoren – solche Dateien tragen dann meist die Endung ".tsv". Bevor Sie eine CSV-Datei importieren, sollten Sie deshalb kurz prüfen, welches Zeichen tatsächlich als Spaltentrenner dient. Kniffliger wird es, wenn ein Feld selbst das Trennzeichen enthält. Ein Beispiel: Der nachfolgend gezeigte Inhalt der CSV-Datei beschreibt Ferrari-Modelle und Preise. Ein Mensch erkennt drei Spalten – Hersteller, Modelle, Preis. Ein einfaches Skript dagegen liest fünf, weil es jedes Komma streng trennt:
nonumber
Maker, Models, Minimum Price
Ferrari, Testarossa, F40, 240,000
Noch schwieriger wird es, wenn ein Feld einen Zeilenumbruch enthält. Was für uns klar ein einziger Datensatz ist, sieht für einen Parser wie zwei halbe Datensätze aus:
nonumber
Maker, Models, Minimum Price
Ferrari,
Testarossa, F40, 240,000
Die Lösung: Felder, die Kommata oder Zeilenumbrüche enthalten, müssen in Anführungszeichen stehen. Tauchen innerhalb eines Felds ebenfalls Anführungszeichen auf, müssen sie mit einem Back-slash maskiert werden:
nonumber
Maker, Models, Minimum Price
"Ferrari", "Testarossa, F40", "240,000"
So weit die Theorie. In der Praxis sind CSV-Dateien oft nicht perfekt formatiert – vor allem, wenn sie manuell bearbeitet wurden. Ein unbedachtes Komma oder ein versehentlicher Zeilenumbruch genügt, um das gesamte Format zu zerstören. Glücklicherweise gibt es eine einfache Lösung für fehlerhaft formatierte CSV-Dateien – vorausgesetzt, die Felder sind korrekt in Anführungszeichen gesetzt.
Bevor wir zu diesem Werkzeug kommen, lohnt sich ein Blick auf die häufigsten Bearbeitungsschritte, die Sie mit Bordmitteln unter Linux erledigen können. Natürlich könnten Sie dafür auch LibreOffice Calc verwenden – solange die Datei fehlerfrei ist. Aber warum manuell klicken, wenn sich dieselbe Aufgabe mit wenigen Zeilen Shell-Code automatisieren lässt? Gerade bei großen oder mehreren Dateien sparen Sie damit eine Menge Zeit.
Spalten hinzufügen
Beginnen wir mit einer einfachen Aufgabe: dem Hinzufügen einer Spalte. Möchten Sie beispielsweise vor jede Zeile einen fortlaufenden numerischen Index setzen, reicht ein einziger AWK-Befehl. Die folgenden Varianten gehen davon aus, dass die CSV-Datei eine Kopfzeile enthält und keine Leerzeilen:
AWK verarbeitet Textdateien zeilenweise. Die Variable "$0" steht für den gesamten Zeileninhalt, "$1", "$2" und so weiter für die einzelnen Felder, während "NR" die aktuelle Zeilennummer bezeichnet. Der erste Befehl gibt vor jeder Datenzeile (außer der ersten) einen Zähler "n" aus und erhöht ihn anschließend. Der zweite Befehl macht dasselbe, verzichtet aber auf eine Hilfsvariable und verwendet stattdessen "NR-2" direkt.
Etwas komplexer wird es, wenn Sie eine neue Spalte zwischen bestehenden Spalten einfügen möchten. Das folgende Beispiel fügt hinter der ersten Spalte eine neue Spalte mit dem festen Wert "HELLO" ein (angenommen, die Datei hat nur drei Spalten):
Aus einer Zeile wie "p,4.6,Bill" wird dadurch "p,HELLO!,4.6,Bill".
Natürlich können Sie an dieser Stelle beliebige Werte einfügen – etwa das Datum einer Revision oder eine leere Platzhalterspalte, die später befüllt wird. Der "BEGIN"-Block enthält Anweisungen, die AWK vor dem Einlesen der Datei ausführt. In diesem Fall definiert er das Trennzeichen sowohl für Eingabe ("FS") als auch Ausgabe ("OFS") als Komma. Wenn Sie stattdessen "OFS="|"" setzen, würde das Beispiel zu "p|HELLO!|4.6|Bill" führen. Mit demselben Prinzip lassen sich auch Spaltenüberschriften ergänzen oder Spaltenreihenfolgen anpassen.
Individuelle Spaltenwerte einfügen
Eine Einschränkung dieser Methode besteht darin, dass Sie keine individuellen Werte in die neue Spalte schreiben können – alle Zeilen erhalten denselben Inhalt. Wenn Sie unterschiedliche Werte benötigen, legen Sie sie zunächst in einer separaten Datei ab, in der jede Zeile einen Wert enthält:
nonumber
Hallo
IT-Administrator
Magazin
Leser
Nun können Sie diese Datei mit dem "paste"-Befehl und Subshells aus Bash in die CSV-Datei einfügen:
Der Befehl paste führt mehrere Dateien zeilenweise zusammen – hier mit Kommata als Trenner (Option "-d','"). Die mittlere Datei ("extracolumn.csv") ist die neue Spalte, die Sie zuvor erstellt haben. Die beiden anderen Eingaben stammen nicht von realen Dateien, sondern aus Subprozessen in Klammern: Sie verwenden "cut", um die Spalten der Originaldatei in zwei Teile zu zerlegen – links die ersten, rechts die restlichen Spalten – und "paste" fügt alles zu einer neuen CSV-Datei zusammen.
In jedem dieser Subprozesse führt der Befehl "cut" eine einfache, aber mächtige Aufgabe aus: Er extrahiert aus der übergebenen Datei bestimmte Spalten, die über die Option "-f" angegeben werden, und nutzt das mit "-d" gesetzte Trennzeichen, um die Felder zu erkennen. Das Ergebnis wird über den Umleitungsoperator "<<" direkt an den Hauptbefehl übergeben – so, als wäre es eine temporäre Datei. Das Beste daran: Solche Subprozesse können auch beliebigen Bash-Code oder ganze Skripte enthalten, die Spalten dynamisch erzeugen. Wenn Sie beispielsweise den folgenden Code einsetzen
<(for i in seq 1 30; do echo $i; done)
und ihn anstelle von "extracolumn.csv" im vorherigen Befehl verwenden, erstellt der Vorgang eine neue Spalte mit fortlaufenden Indexnummern. Ebenso könnten Sie an dieser Stelle ein Skript einfügen, das Werte aus einer Datenbank abfragt oder in Echtzeit generiert. Was aber, wenn sich die Werte in der neuen Spalte aus den vorhandenen Spalten ableiten sollen? Angenommen, eine CSV-Datei enthält Zahlen und Sie möchten eine zusätzliche Spalte mit der Summe aller numerischen Felder pro Zeile erzeugen:
nonumber
A,15,-3
B,21,7
Auch das lässt sich ziemlich elegant mit AWK lösen:
In diesem Code wird die Variable "sum" zu Beginn jeder Zeile auf "0" gesetzt. Danach summiert AWK die Werte aller numerischen Felder – hier ab der zweiten Spalte – und gibt am Ende die gesamte Zeile plus den Summenwert aus. Die Variable "NF" steht für die Anzahl der Felder in der aktuellen Zeile. Eine ähnliche Technik erlaubt es, am Ende der Datei eine Summenzeile hinzuzufügen, die die Gesamtsummen aller Spalten enthält:
Hier addiert AWK beim Einlesen jeder Zeile die Werte der numerischen Felder zu einem Array "a", das die Spaltensummen aufnimmt. Nach dem letzten Datensatz wird im "END"-Block die Zeile "SUM" ausgegeben, gefolgt von den aufsummierten Werten:
nonumber
A,15,-3
B,21,7
SUM,36,4
Bevor wir zu einer anderen Methode übergehen, noch ein nützlicher Hinweis: AWK kann nicht nur Spalten hinzufügen, sondern auch entfernen, beispielsweise die ersten beiden:
> awk '{$1=$2=""; print $0}' somefile.csv
Das leert einfach die ersten beiden Felder vor der Zeilenausgabe – ein schneller Weg, um Spalten loszuwerden, ohne die Datei umständlich zu bearbeiten.
Formeln in CSV-Dateien nutzen
Fast alle, die mit Tabellenkalkulationen wie LibreOffice Calc arbeiten, wissen, dass sich Tabellen als CSV-Dateien speichern und wieder öffnen lassen. Viele gehen jedoch davon aus, dass CSV-Dateien keine Formeln oder dynamischen Inhalte enthalten können – ein Irrtum. Wie bereits erwähnt, kann eine CSV-Datei jedes textbasierte Format enthalten, also auch Tabellenformeln.
In Calc oder ähnlicher Software lassen sich Formeln eingeben, die automatisch neu berechnet werden, sobald sich ein Bezugswert ändert. Wie in Bild 1 zu sehen, bestehen solche Formeln nur aus Text – aus Buchstaben, Zahlen, Klammern und Sonderzeichen – und lassen sich daher problemlos in CSV-Dateien speichern.
Bild 1: Auch Tabellenformeln sind letztlich nur Text und lassen sich in CSV-Dateien speichern.
Wenig bekannt ist zudem, dass LibreOffice Calc CSV-Dateien aktiv verarbeiten kann. In den Dialogen, die in den Bildern 2 und 3 zu sehen sind, lässt sich beim Speichern einer Tabelle als CSV-Datei nicht nur der Zeichensatz, das Trennzeichen und die Anführungszeichen festlegen, sondern auch die Option aktivieren, Formeln anstelle berechneter Werte zu speichen. Hierfür navigieren Sie zu "Extras / Optionen / LibreOffice Calc / Ansicht" und aktivieren unter "Anzeige" das Kontrollkästchen "Formeln". So können Sie Formeln direkt im CSV-Export erhalten – ideal, wenn Sie Daten später weiterverarbeiten möchten.
Bild 2: Beim Speichern einer Tabelle im CSV-Format bleiben Formeln erhalten, wenn Sie die entsprechende Option aktivieren.
Wenn Sie diese Option beim Speichern der Tabelle aus Bild 1 nutzen, erzeugt LibreOffice eine Textdatei, in der die Formel exakt so enthalten ist, wie Sie sie in der Tabelle eingegeben haben. Öffnen Sie die Datei später erneut, erscheint der Dialog aus Bild 3. Wenn Sie dort die Option "Formeln auswerten" aktivieren, interpretiert LibreOffice jede Zeichenkette, die mit einem Gleichheitszeichen ("=") beginnt, automatisch als Tabellenformel.
Die Syntax und Operatoren von LibreOffice-Formeln sind leicht zu lernen – und online finden Sie unzählige Beispiele und Tutorials dazu. Mit diesem Wissen und ein paar Standardwerkzeugen aus dem Linux-Umfeld können Sie CSV-Dateien mit automatisch generierten Formeln erstellen. Programme wie LibreOffice Calc oder Microsoft Excel erkennen diese Formeln anschließend problemlos und behandeln die Datei, als wäre sie direkt in der Anwendung entstanden.
Ein Beispiel aus der Praxis: Der Autor nutzt dieses Verfahren jedes Jahr für seine Steuererklärung. Wie in seinem Plain-Text-Accounting-Tutorial [1] beschrieben, verwaltet er zwei CSV-Dateien – "income.csv" und "expenses.csv" – die statt Kommata Pipe-Zeichen ("|") verwenden und etwa so aussehen:
nonumber
2024-12-18| -100- | accountant fees
2024-12-24| -263.72 | taxes
Wenn es Zeit wird, dem Steuerberater die Übersicht zu schicken, führt ein Skript beide Dateien zusammen, zählt automatisch alle Zeilen und fügt am Ende Summenzeilen mit dynamischen Formeln an – also etwa:
Total income|"=sum(B2:B25)"|
Total expenses|"=sum(B26:B38)"|
Das tatsächliche Skript ist deutlich komplexer, da es Einnahmen und Ausgaben zusätzlich nach Kategorien gruppiert. Das Prinzip bleibt aber gleich: Nach der automatischen Berechnung öffnet der Autor die Datei kurz in LibreOffice Calc, prüft das Ergebnis, speichert sie im ODS-Format und sendet sie weiter. Zahlreiche weitere Beispiele für die skriptgesteuerte Erzeugung von Formeln in CSV-Dateien finden Sie unter [2].
Streng genommen müssten Sie solche Workflows nicht zwingend mit CSV-Dateien automatisieren – Sie könnten auch direkt das OpenDocument-Format (ODS) verwenden. ODS-Dateien bestehen im Kern aus ZIP-Archiven mit XML-Dateien, also ebenfalls aus reinem Text. Allerdings sind sie deutlich umfangreicher und schwerer zu verarbeiten. Der Vorteil von CSV liegt gerade in der Schlichtheit: Sie erreichen denselben Zweck mit minimalem Textaufwand, klaren Strukturen und Werkzeugen, die auf jedem System verfügbar sind.
Bild 3: Tabellenkalkulationen wie LibreOffice Calc oder Excel können Formeln in CSV-Dateien berechnen, wenn sie als Formeln gespeichert sind.
CSV-Dateien zusammenführen mit csvtool
Das Kommandozeilenwerkzeug "csvtool" [3] – in den Paketquellen aller gängigen Linux-Distributionen verfügbar – kann CSV-Dateien auf unterschiedliche Weise zusammenführen und ist speziell für Formatierungs- und Verarbeitungsschritte rund um CSV-Dateien entwickelt. Oft bieten sich universellere Tools wie AWK oder Perl-Skripte an, weil sich damit zusätzliche Verarbeitungsschritte flexibler umsetzen lassen. Trotzdem lohnt es sich, csvtool zu kennen: Einige der zugehörigen Optionen lassen sich nämlich mit AWK nur schwer oder gar nicht als Einzeiler nachbilden – und machen sich daher besonders gut in Shell-Skripten, in denen es auf Geschwindigkeit ankommt. Wenn Sie beispielsweise bestimmte Spalten extrahieren möchten, genügt folgender Befehl:
csvtool col 1-3,6 input.csv
Oder Sie wollen nur die Spalten "Address" und "PhoneNumber" aus einer Adressdatei herausziehen – dann verwenden Sie die Option "namedcol":
Sehr praktisch ist auch "width", das die Anzahl der Spalten in der breitesten Zeile einer CSV-Datei ermittelt. Weitere hilfreiche Funktionen sind "setcolumns cols", das dafür sorgt, dass alle Zeilen die gleiche Spaltenanzahl haben: Kürzere Zeilen werden mit leeren Feldern aufgefüllt, längere automatisch gekürzt. Und schließlich können Sie mit einem einzigen Befehl die Zeilen und Spalten vertauschen, also die Datei transponieren:
csvtool transpose input.csv
csvquote zur CSV-Bereinigung
Alle bisher gezeigten Techniken setzen stillschweigend voraus, dass die CSV-Dateien sauber formatiert sind – also keine Anführungszeichen enthalten, in denen sich Kommas, Zeilenumbrüche oder andere Trennzeichen verstecken. Wie so oft in der Open-Source-Welt gibt es auch dafür ein elegantes Spezialwerkzeug: "csvquote" [4]. Es bereinigt CSV-Dateien und ist nicht über den Paketmanager installierbar, lässt sich aber in wenigen Schritten selbst kompilieren:
make
sudo make install
Nach der Installation stehen Ihnen zwei Programme zur Verfügung: csvquote selbst und "csvheader", ein praktisches Hilfsskript, das in der ersten Zeile die Feldnummern neben den Spaltennamen ausgibt. Die Verwendung von csvquote ist denkbar einfach: Sie setzen es an den Anfang und das Ende einer Verarbeitungspipeline – also vor und nach den eigentlichen Skripten oder Befehlen:
Beim ersten Aufruf ersetzt csvquote problematische Zeichen – also Kommata, Zeilenumbrüche oder Trennzeichen innerhalb von Anführungszeichen – durch nicht druckbare Platzhalterzeichen. Dadurch lassen sich die Dateien gefahrlos mit Standardtools wie AWK, "grep" oder "sed" weiterverarbeiten, ohne dass die Struktur der CSV-Datei verloren geht [4].
Am Ende der Pipeline kommt csvquote mit der Option "-u" erneut zum Einsatz, um alle Platzhalter wieder in die ursprünglichen Zeichen zurückzuverwandeln. Standardmäßig geht das Tool davon aus, dass Felder durch doppelte Anführungszeichen umschlossen und durch Kommata getrennt sind, sowie, dass Datensätze durch Zeilenumbrüche ("\n") voneinander getrennt werden. Mit den Schaltern "-d" (Trennzeichen), "-q" (Zitatzeichen) und "-r" (Zeilenumbruch) können Sie diese Vorgaben anpassen.
Mehrzeichen-Trennungen unterstützt csvquote zwar nicht, doch solche Fälle sind in der Praxis äußerst selten. Ein weiterer Vorteil: Solange csvquote aktiv ist, können andere Tools keine Zeichen innerhalb der Anführungszeichen unbeabsichtigt verändern. Falls Sie dennoch gezielt auf die Platzhalterzeichen zugreifen müssen, finden Sie in der Dokumentation [4] eine Übersicht der verwendeten Sonderzeichen und deren Rückwandlung.
Zeit für ein neues CSVfix
Das größte Problem bei CSV-Dateien ist ihre Fehleranfälligkeit. Ein einziges falsch gesetztes oder fehlendes Trennzeichen oder Anführungszeichen genügt, und all die zuvor beschriebenen Tricks laufen ins Leere. In solchen Fällen bleibt meist nur der manuelle Eingriff – also die Datei im Editor öffnen, nach dem Fehler suchen und ihn von Hand korrigieren.
Früher war das anders. Vor über zehn Jahren gab es ein Werkzeug, das viele dieser Probleme automatisch beheben konnte: CSVfix [5]. Leider wurde das Projekt bereits vor rund einem Jahrzehnt aufgegeben. Übrig geblieben sind nur die Dokumentation und ein Quellcode-Archiv, das heute umfangreiche Anpassungen erfordern würde, um auf aktuellen Linux-Distributionen wieder lauffähig zu sein. Ein echter Verlust, denn CSVfix konnte eine Menge:
- Spalten neu anordnen, entfernen, aufteilen oder zusammenführen
- Groß- und Kleinschreibung automatisiert konvertieren.
- Leerzeichen am Anfang und Ende von Feldern entfernen.
- Dubletten oder Einträge aus Ausschlusslisten filtern.
- Große CSV-Dateien nach Feldinhalten automatisch aufteilen.
- Berechnungen dediziert auf einzelne Felder anwenden.
Kurz gesagt: CSVfix war ein Schweizer Taschenmesser für die Arbeit mit CSV-Dateien. Es wäre großartig, wenn dieser Workshop einen Entwickler oder ein Team dazu inspirieren würde, das Projekt wiederzubeleben und in eine moderne Version zu überführen – die Community hätte es verdient.
Fazit
CSV-Dateien mögen altmodisch wirken, doch sie bleiben ein unersetzbares Austauschformat – portabel, transparent und unabhängig von Datenbankstrukturen. Mit den richtigen Tools lassen sich auch große oder fehlerhafte Dateien effizient bearbeiten. AWK und csvtool übernehmen dabei die Routinearbeit, während csvquote die Tücken verschachtelter Felder entschärft. Und wer sich an Projekte wie das eingestellte CSVfix erinnert, weiß, welches Potenzial in spezialisierten Werkzeugen steckt. Zum Schluss noch der Tipp, CSV-Dateien nicht direkt in Excel zu öffnen, sondern stattdessen zu importieren. Denn beim direkten Öffnen wird das Trennzeichen oft falsch interpretiert und die Formatierung ist dahin.
(dr)
Links
[1] Artikel zur textbasierten Buchführung, Linux-Magazine- Ausgabe 285: https://it-a.eu/q4p01