Cómo leer un archivo CSV en lenguaje C (parseo con strtok)

Muchos productos de software que manejan números y cálculos pueden exportar datos a archivos CSV (Valores Separados por Comas). Este formato es eficaz para transportar datos entre programas, ya que es legible y fácil de manipular. Muchos programas en C que tratan datos probablemente tengan que leer un CSV en algún momento.

Paso 1

Consulte la documentación del programa que genera el CSV. Determine el número de campos por línea y el formato de cada campo. Ejemplo: 1, "test", 34.5 → tres campos: entero, cadena, flotante.

Paso 2

Cree una estructura con un miembro para cada campo identificado. Para el ejemplo: struct data { int col1; char *col2; float col3; };

Paso 3

Cree una función que maneje la lectura del CSV. Debe ser accesible al resto del programa y trabajar con estructuras de datos comunes. Pase el parámetro por referencia para evitar valor de retorno. Prototipo: void ParseCSV(char *filename, data& input);

Paso 4

Incluya la cabecera estándar de E/S: #include <stdio.h> al inicio del archivo fuente que leerá el CSV.

Paso 5

Incluya la librería de strings: #include <string.h> al inicio del mismo archivo.

Paso 6

Cree un objeto archivo para leer los datos: FILE * pInput;

Paso 7

Cree un búfer de caracteres lo bastante grande para una línea. Declare un array: #define BUFFER_SIZE 1024 char buf[BUFFER_SIZE];

Paso 8

Abra el archivo y asígnelo al objeto FILE: pInput = fopen("filename", "r")

Paso 9

Lea una línea: fgets(buf, sizeof(buf), pInput)

Paso 10

Analice el CSV con strtok. Cree un puntero a tokens e inicialícelo con la línea leída: char *tok = strtok(buf, ",")

Paso 11

Convierta el token recibido al tipo apropiado. Para el ejemplo 1, "test", 3.45: row.col1 = atoi(tok);

Paso 12

Para lecturas subsiguientes de la misma línea, pase NULL a strtok: tok = strtok(NULL, ","). Convierta cada token. Código completo para una línea: char *tok = strtok(buf, ","); row.col1 = atoi(tok); tok = strtok(NULL, ","); row.col2 = tok; tok = strtok(NULL, ","); row.col3 = atof(tok);

Paso 13

Repita para todas las entradas de cada línea. strtok seguirá proporcionando datos entre comas hasta agotar el búfer, devolviendo NULL (fin de línea).

Consejo

Encapsule la conversión de datos en otra función para código más legible. Use fgets en bucle while para recorrer todo el archivo (devuelve NULL al final).

Advertencia

fopen puede devolver NULL si hay error; verifique el archivo antes de usarlo. Los tokens pueden no tener el formato esperado; examine los datos antes de convertir ciegamente (cadena vacía, NULL, etc.).