CSV ein unterschätztes Dateiformat

Comma-separated Values, kurz CSV ist ein unterschätztes Dateiformat, welches gerade für große Datenmengen gut geeignet ist.

Im Gegensatz zu Formaten wie JSON oder XML bietet CSV einen entscheidenden Vorteil. Jede Zeile einer CSV Datei ist in sich selbst abgeschlossen. Dadurch wird das Einlesen großer Dateien sehr effizient.

Aufbau

In einer üblichen CSV-Datei gibt es pro Zeile einen Datensatz, welcher durch den Zeilenumbruch abgeschlossen wird. Die einzelnen Datenfelder wiederum werden oft durch Komma, Semikolon oder einem Tab getrennt. Um Probleme mit Sonderzeichen innerhalb eines Feldes zu vermeiden, kann ein Feld noch einmal mit einem Feldbegrenzer umschlossen werden. Hierfür wird meist das doppelte Anführungszeichen verwendet. 

1,Klaus,"Pizza, Pasta, Lasagne"
2,Franz,"Burger, Currywurst"

In manchen Fällen bietet es sich an die erste Zeile für die Bezeichnungen der Spalten zu nutzen, hierbei gelten dieselben Regeln.

ID,Vorname,Lieblingsspeisen
1,Klaus,"Pizza, Pasta, Lasagne"
2,Franz,"Burger, Currywurst"

Effizientes Einlesen

Wie erwähnt können CSV Dateien zeilenweise eingelesen werden. Dies ermöglicht in Programmiersprachen wie PHP sehr effizient Daten aus CSV Dateien zu verarbeiten. Die Anwendung kann Zeile für Zeile den Inhalt auslesen, dabei kann der Inhalt der Zeile verarbeitet werden und danach im Anwendungsspeicher verworfen werden. So wird nie mehr als eine Zeile in der Anwendung gehalten.

<?php
$fileResource = fopen('example.csv', 'r');
while (($line = fgetcsv($file)) !== false) {
  echo $line.PHP_EOL;
}
fclose($fileResource);

Wir können etwa Adressdaten zeilenweise auslesen, validieren und im Zielsystem speichern. Dies kann unter anderem eine Datenbank sein.

Effizientes schreiben

Äquivalent zum Einlesen verhält es sich mit dem Schreiben einer neuen CSV Datei. Dadurch, dass die Datei Zeile für Zeile geschrieben wird, können wir fast unbegrenzt große Dateien anlegen, die auch wieder auslesbar sind. 

Tabellenkalkulation

Microsoft Excel, OpenOffice Calc, Google Sheets usw. haben alle ihre eigenen Dateiformate. Als Entwickler ist die Freude nicht sonderlich groß, wenn die Anforderung kommt einen Datenexport für eins der genannten Programme zu entwickeln. Sollten Formatierungen nicht relevant sein, sondern lediglich reinen Daten, so ist CSV eine gute Option. Alle Tabellenkalkulationsprogramme können CSV importieren. Je nach Anforderung bietet es sich an zu prüfen, welches Trennzeichen sich am besten für den Export eignet.

Grenzenlos?

Es scheint, als ob für CSV Dateien keinerlei Grenzen gelten. In der Theorie ist auch erst die maximale Dateigröße eine wirkliche Grenze. Es bleibt allerdings zu beachten, aber einer großen Anzahl an Datensätzen pro Datei, sollte trotzdem über eine Aufteilung nachgedacht werden.

Zum einen können mehrere Dateien gleichzeitig in mehreren Prozessen eingelesen werden. Zum anderen kann es in der Entwicklung immer zu Fehlern kommen, wodurch beim Schreiben oder Auslesen Probleme auftreten könnten. Werden die Daten aufgeteilt, wird auch der Anteil an Fehlern minimiert.

Beispiel aus der Praxis

Im Arbeitskontext gibt es einen Queue gesteuerten Mechanismus, der sehr aufwendig Daten innerhalb des Systems zusammenträgt und verarbeitet. Dessen Resultate werden in einer CSV Datei gespeichert. Durch die Queue im Hintergrund und die Speicherung mittels CSV ist es eine optimale Möglichkeit den Prozess beliebig skalieren zu lassen. Es ist egal, ob an einem Tag nun 100 oder 1.000 oder 100.000 Einträge generiert werden müssen.

Die Ergebnisse könnten genauso gut auch in einer Datenbank gespeichert werden, allerdings müssen die Daten täglich an ein anderes externes System via SFTP übermittelt werden. Da bietet es sich an, über einen so simplen Datentyp die Daten auszutauschen.

Ein weiterer Vorteil von CSV ist im Laufe des Entwicklungsprozesses klar geworden. Datenbanken wie MySQL oder MariaDB sind auszeichnend im Import von CSV Dateien.

Fazit

CSV ist ein sehr praktisches Dateiformat für große Datenmengen, welche eine gleichbleibende Struktur aufweisen.

Um einzelne Datenobjekte innerhalb eines Schnittstellenkontextes zu übermitteln, sollte weiterhin auf Formate wie JSON oder XML gesetzt werden. Es spricht auch nichts dagegen mittels JSON mehrere Hundert Datensätze auszugeben oder zu speichern.

Müssen allerdings viele Datensätze für ein Datenbanksystem oder eine Tabellenkalkulation exportiert werden, bietet sich CSV an.