cpp

Leer CSV con C++

En este artículo de programación en C++ (también conocido como CPP) te enseñaré a leer y parsear un archivo CSV (valores separados por coma) para leer todo su contenido, sin usar librerías externas.

Para ello vamos a necesitar leer el archivo línea por línea y luego separar cada línea según el delimitador. Todo esto lo vamos a hacer con C++ y funciones nativas.

Algoritmo

Analicemos primero lo que tenemos que hacer. Vamos a leer un CSV con C++ así que primero necesitamos abrir el archivo y leerlo línea por línea, ya que en cada línea hay un nuevo conjunto de valores.

En este caso vamos a omitir la primera línea, pues normalmente ella tiene el encabezado; pero una vez que la hemos leído procedemos a leer las demás hasta el final del archivo en un ciclo.

Dentro de este ciclo vamos a separar la cadena (línea) según el delimitador, que en este caso es la coma. Y después de eso ya podemos extraer cada valor en una variable aparte y hacer cualquier cosa con ella como imprimirla o escribirla en otro archivo.

El archivo CSV

Para este ejemplo voy a usar un CSV que ha exportado un sistema de ventas gratis que publiqué hace algún tiempo, mismo que se ve así:

idProducto,codigoBarras,descripcion,precioCompra,precioVenta,existencia,stock
4,4,NodeMCU ESP8266,100.00,150.00,200.00,1.00
3,3,Nintendo Switch,8000.00,8500.00,20.00,2.00
2,2,Audifonos HyperX,1200.00,1500.00,20.00,1.00
1,1,Teclado HyperX,1800.00,2000.00,500.00,20.00

Como puedes ver, contamos con 4 filas y en cada una de ellas existen 7 columnas.

Es importante que el CSV tenga una estructura definida y consistente. Ahora veamos el código.

Nota: vamos a leer el archivo y vamos a tratar todos los datos como cadena. Ya después tú puedes convertirlos a double, int, etcétera.

Leer CSV con C++

Leer y extraer valores de CSV con C++

Ahora sí veamos el código. Primero abrimos el archivo y lo leemos:

ifstream archivo(NOMBRE_ARCHIVO);
string linea;
char delimitador = ',';
// Leemos la primer línea para descartarla, pues es el encabezado
getline(archivo, linea);
// Leemos todas las líneas
while (getline(archivo, linea))
{

    // Magia aquí...
}

archivo.close();

Dentro del ciclo tendremos la línea, y es momento de separarla para almacenar sus valores. Como bien dice arriba, el delimitador es la coma. Entonces hacemos lo siguiente:

stringstream stream(linea); // Convertir la cadena a un stream
string idProducto, codigoBarras, descripcion, precioCompra, precioVenta, existencia, stock;
// Extraer todos los valores de esa fila
getline(stream, idProducto, delimitador);
getline(stream, codigoBarras, delimitador);
getline(stream, descripcion, delimitador);
getline(stream, precioCompra, delimitador);
getline(stream, precioVenta, delimitador);
getline(stream, existencia, delimitador);
getline(stream, stock, delimitador);
// Imprimir
cout << "==================" << endl;
cout << "Id: " << idProducto << endl;
cout << "Codigo de barras: " << codigoBarras << endl;
cout << "Descripcion: " << descripcion << endl;
cout << "Precio de compra: " << precioCompra << endl;
cout << "Precio de venta: " << precioVenta << endl;
cout << "Existencia: " << existencia << endl;
cout << "Stock: " << stock << endl;

Como puedes ver, la extracción de los valores está desde la línea 4 hasta la línea 10, leemos de la línea y colocamos cada valor dentro de cada variable. Recuerda que debe ser en el mismo orden que tienen las columnas dentro del archivo CSV.

El código completo queda así:

/*
    https://parzibyte.me/blog
*/#include <iostream>
#include <sstream>
#include <fstream>
#define NOMBRE_ARCHIVO "ProductosExportados_SPOS3.csv"
using namespace std;

int main()
{
    ifstream archivo(NOMBRE_ARCHIVO);
    string linea;
    char delimitador = ',';
    // Leemos la primer línea para descartarla, pues es el encabezado
    getline(archivo, linea);
    // Leemos todas las líneas
    while (getline(archivo, linea))
    {

        stringstream stream(linea); // Convertir la cadena a un stream
        string idProducto, codigoBarras, descripcion, precioCompra, precioVenta, existencia, stock;
        // Extraer todos los valores de esa fila
        getline(stream, idProducto, delimitador);
        getline(stream, codigoBarras, delimitador);
        getline(stream, descripcion, delimitador);
        getline(stream, precioCompra, delimitador);
        getline(stream, precioVenta, delimitador);
        getline(stream, existencia, delimitador);
        getline(stream, stock, delimitador);
        // Imprimir
        cout << "==================" << endl;
        cout << "Id: " << idProducto << endl;
        cout << "Codigo de barras: " << codigoBarras << endl;
        cout << "Descripcion: " << descripcion << endl;
        cout << "Precio de compra: " << precioCompra << endl;
        cout << "Precio de venta: " << precioVenta << endl;
        cout << "Existencia: " << existencia << endl;
        cout << "Stock: " << stock << endl;
    }

    archivo.close();
}

Así es como se usa C++ para leer un CSV. También te invito a que leas más sobre Programación C++ / CPP en mi blog.

Si no te ha quedado claro, puedes repasar con un vídeo:

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

3 días hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

3 días hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

3 días hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

3 días hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

3 días hace

Solución: Apache – Server unable to read htaccess file

Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…

4 días hace

Esta web usa cookies.