Come leggere un file CSV in C
Molti software che gestiscono numeri e calcoli possono esportare dati in file CSV (Comma Separated Values). Questo formato è efficace per trasportare dati tra programmi, essendo leggibile e facile da manipolare. Molti programmi C che trattano dati dovranno leggere file CSV prima o poi.
Passaggio 1
Consultare la documentazione del programma che fornisce il CSV. Determinare il numero di campi per riga e il formato di ciascun campo. Esempio: riga 1, "test", 34.5 → tre campi: intero, stringa, float.
Passaggio 2
Creare una struttura con un membro per ogni campo identificato. Per l'esempio: struct data { int col1; char *col2; float col3; };
Passaggio 3
Creare una funzione che gestisca la lettura del CSV. Deve essere accessibile al resto del programma e lavorare su strutture dati comuni. Passare parametro per riferimento per evitare valore di ritorno. Prototipo: void ParseCSV( char *filename, data& input );
Passaggio 4
Includere header IO standard: #include <stdio.h> all'inizio del file sorgente che leggerà il CSV.
Passaggio 5
Includere libreria stringhe per manipolazione: #include <string.h> all'inizio dello stesso file.
Passaggio 6
Creare oggetto file per leggere i dati: FILE * pInput;
Passaggio 7
Creare buffer caratteri abbastanza grande per una riga alla volta. In C si dichiara array di dimensione sufficiente: #define BUFFER_SIZE 1024 char buf[BUFFER_SIZE];
Passaggio 8
Aprire il file e assegnarlo all'oggetto FILE: pInput = fopen("filename", "r")
Passaggio 9
Leggere una riga: fgets(buf, sizeof(buf), pInput)
Passaggio 10
Analizzare (parsare) il CSV con strtok. Creare stringa per token e inizializzarla con dati letti: char *tok = strtok(buf, ",")
Passaggio 11
Convertire il token nel tipo appropriato. Esempio: row.col1 = atoi(tok); per intero.
Passaggio 12
Per letture successive sulla stessa riga, passare NULL a strtok invece del buffer: tok = strtok(NULL, ","). Convertire token nel tipo corretto. Codice parsing riga singola: char *tok = strtok(buf, ","); row.col1 = atoi(tok); tok = strtok(NULL, ","); row.col2 = tok; tok = strtok(NULL, ","); row.col3 = atof(tok);
Passaggio 13
Ripetere per tutti i campi di ogni riga. strtok continua a fornire dati tra virgole finché non finisce il buffer, poi restituisce NULL indicando fine riga.
Suggerimento
Incapsulare la conversione dati in un altro metodo per codice più leggibile. fgets restituisce NULL a fine file: usarlo in ciclo while per leggere tutto il file.
Avvertenza
fopen può restituire NULL in caso di errore: verificare file prima di usarlo. In alcuni casi i token potrebbero non avere formato atteso: esaminare dati prima di convertire ciecamente (controllare stringa vuota, NULL, ecc.).