Arbeit mit CSV in C++: Bibliotheken und praktische Beispiele
CSV (Comma-Separated Values) ist eines der am weitesten verbreiteten Formate zur Speicherung von Tabellendaten. In C++ gibt es keine integrierte Unterstützung für CSV in der Standardbibliothek (bis C++23), daher verwenden Entwickler externe Bibliotheken oder schreiben eigene Parser. In diesem Artikel werden wir die grundlegenden Ansätze für die Arbeit mit CSV in C++ behandeln: vom manuellen Parsing bis hin zu fertigen Lösungen.
Warum werden Bibliotheken für CSV benötigt?
CSV-Dateien erscheinen einfach, enthalten aber in der Praxis viele Fallstricke:
- Escape von Anführungszeichen innerhalb von Feldern (z.B.
"Hello, world") - Mehrzeilige Werte
- Verschiedene Trennzeichen (Komma, Semikolon, Tabulator)
- Verschiedene Kodierungen (UTF-8, UTF-16, ANSI)
Fertige Bibliotheken lösen diese Probleme und sparen Zeit.
1. Manuelles CSV-Parsing (ohne externe Bibliotheken)
Für einfache Fälle kann man einen Parser selbst schreiben. Beispiel zum Lesen einer CSV mit std::ifstream und std::getline:
#include <iostream>#include <fstream>#include <sstream>#include <vector>#include <string>
std::vector<std::vector<std::string>> parseCSV(const std::string& filename) { std::vector<std::vector<std::string>> data; std::ifstream file(filename); std::string line;
while (std::getline(file, line)) { std::vector<std::string> row; std::stringstream ss(line); std::string cell;
while (std::getline(ss, cell, ',')) { // Entferne überflüssige Anführungszeichen (vereinfacht) if (cell.size() >= 2 && cell.front() == '"' && cell.back() == '"') { cell = cell.substr(1, cell.size() - 2); } row.push_back(cell); } data.push_back(row); } return data;}Nachteile: Behandelt keine escaped Kommas innerhalb von Anführungszeichen, mehrzeilige Felder oder leere Zeilen am Ende der Datei.
2. Die Bibliothek libcsv (C)
libcsv ist eine leichtgewichtige C-Bibliothek, die CSV korrekt gemäß RFC 4180 parst. Geeignet für Projekte, bei denen Leistung wichtig ist.
Installation (Linux): sudo apt-get install libcsv-dev
#include <csv.h>#include <iostream>#include <vector>
void cb1(void *s, size_t len, void *data) { std::string field(static_cast<char*>(s), len); static_cast<std::vector<std::string>*>(data)->push_back(field);}
void cb2(int c, void *data) { if (c == CsvRowEnd) { // Zeilenende — ausgeben auto& row = *static_cast<std::vector<std::string>*>(data); for (const auto& f : row) std::cout << f << " | "; std::cout << ""; row.clear(); }}
int main() { FILE *fp = fopen("data.csv", "r"); if (!fp) return 1;
struct csv_parser p; csv_init(&p, CSV_STRICT);
std::vector<std::string> row; char buf[1024]; size_t bytes_read;
while ((bytes_read = fread(buf, 1, sizeof(buf), fp)) > 0) { csv_parse(&p, buf, bytes_read, cb1, cb2, &row); } csv_fini(&p, cb1, cb2, &row); csv_free(&p); fclose(fp); return 0;}3. Die Bibliothek rapidcsv (C++ header-only)
rapidcsv ist eine moderne C++17-Bibliothek, die nur mit Header-Dateien arbeitet. Unterstützt automatische Erkennung von Trennzeichen, Arbeit mit verschiedenen Datentypen und das Schreiben von CSV.
Installation: rapidcsv.h in das Projekt kopieren.
#include "rapidcsv.h"#include <iostream>#include <vector>
int main() { // CSV lesen rapidcsv::Docum Auch in der Bibliothek
OAuth-Client für C++: Die Bibliothek liboauth für die Autorisierung
Sinon für JavaScript (Node.js): Komplettguide mit Beispielen
Arbeiten mit Excel in C# (.NET): Bibliotheken EPPlus, ClosedXML und NPOI