Leer y extraer valores de CSV con C++

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++
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.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *