Trabajo con CSV en C++: bibliotecas, análisis y escritura de datos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Trabajo con CSV en C++: bibliotecas y ejemplos prácticos



CSV (Valores Separados por Comas) es uno de los formatos más comunes para almacenar datos tabulares. En C++ no hay soporte integrado para CSV en la biblioteca estándar (hasta C++23), por lo que los desarrolladores utilizan bibliotecas de terceros o escriben sus propios analizadores. En este artículo, exploraremos los enfoques principales para trabajar con CSV en C++: desde el análisis manual hasta soluciones ya preparadas.



¿Por qué son necesarias las bibliotecas para CSV?

Los archivos CSV parecen simples, pero en la práctica contienen muchas trampas:

  • Escapado de comillas dentro de los campos (por ejemplo, "Hello, world")
  • Valores multilínea
  • Diferentes separadores (coma, punto y coma, tabulación)
  • Diferentes codificaciones (UTF-8, UTF-16, ANSI)

Las bibliotecas ya preparadas resuelven estos problemas y ahorran tiempo.



1. Análisis manual de CSV (sin bibliotecas de terceros)

Para casos simples, se puede escribir un analizador propio. Ejemplo de lectura de CSV usando std::ifstream y 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, ',')) { // Eliminamos comillas sobrantes (simplificado) 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;}


Desventajas: no maneja comas escapadas dentro de comillas, campos multilínea ni líneas vacías al final del archivo.



2. Biblioteca libcsv (C)

libcsv es una biblioteca ligera en C que analiza correctamente CSV según RFC 4180. Es adecuada para proyectos donde el rendimiento es importante.

Instalación (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 línea — mostramos 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. Biblioteca rapidcsv (C++ solo header)

rapidcsv es una biblioteca moderna C++17 que funciona solo con archivos de cabecera. Soporta detección automática de separadores, trabajo con diferentes tipos de datos y escritura de CSV.

Instalación: copiar rapidcsv.h en el proyecto.



#include "rapidcsv.h"#include <iostream>#include <vector>

int main() { // Lectura de CSV rapidcsv::Docum

Recommendations