Travailler avec CSV en C++ : bibliothèques et exemples pratiques
CSV (Comma-Separated Values) est l'un des formats les plus courants pour stocker des données tabulaires. En C++, il n'y a pas de support intégré pour CSV dans la bibliothèque standard (jusqu'à C++23), donc les développeurs utilisent des bibliothèques tierces ou écrivent leurs propres analyseurs. Dans cet article, nous examinerons les principales approches pour travailler avec CSV en C++ : de l'analyse manuelle aux solutions prêtes à l'emploi.
Pourquoi des bibliothèques pour CSV ?
Les fichiers CSV semblent simples, mais en pratique, ils contiennent de nombreux pièges :
- Échappement des guillemets à l'intérieur des champs (par exemple,
"Hello, world") - Valeurs sur plusieurs lignes
- Différents séparateurs (virgule, point-virgule, tabulation)
- Différents encodages (UTF-8, UTF-16, ANSI)
Les bibliothèques prêtes à l'emploi résolvent ces problèmes et font gagner du temps.
1. Analyse manuelle de CSV (sans bibliothèques tierces)
Pour les cas simples, vous pouvez écrire votre propre analyseur. Exemple de lecture CSV avec std::ifstream et 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, ',')) { // Supprimer les guillemets superflus (simplifié) 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;}Inconvénients : ne gère pas les virgules échappées entre guillemets, les champs multilignes, les lignes vides en fin de fichier.
2. Bibliothèque libcsv (C)
libcsv est une bibliothèque légère en C qui analyse correctement le CSV conformément à la RFC 4180. Convient aux projets où la performance est importante.
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) { // Fin de ligne — affichage 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. Bibliothèque rapidcsv (C++ header-only)
rapidcsv est une bibliothèque moderne C++17, fonctionnant uniquement avec des fichiers d'en-tête. Elle prend en charge la détection automatique du séparateur, le travail avec différents types de données et l'écriture de CSV.
Installation : copier rapidcsv.h dans le projet.
#include "rapidcsv.h"#include <iostream>#include <vector>
int main() { // Lecture CSV rapidcsv::Docum Aussi dans la bibliothèque
Autorisation et authentification en Rust : guide complet
Parsing HTML en PHP : DOMDocument, SimpleXML et cURL pour le web scraping
csv — Travailler avec des fichiers CSV en Rust
ring pour Rust : guide complet avec exemples
Traitement d'images en Go : redimensionnement et recadrage avec la bibliothèque imaging