Come leggere un file CSV in C
Molti prodotti software che si occupano di numeri e calcoli hanno la capacità di generare dati in un file CSV (Comma Separated Value). Questo formato può essere un modo efficace per trasportare dati tra diversi programmi, poiché è leggibile e abbastanza facile da manipolare. Molti programmi C che gestiscono dati dovranno probabilmente leggere da un file CSV a un certo punto.
Passaggio 1
Consulta la documentazione del programma che fornisce il file CSV. Determina il numero di campi in ogni riga, nonché il formato di ogni campo. Ad esempio, se un programma fornisce un CSV con i seguenti dati:1, "test", 34.5 Contrassegneresti tre campi:un intero, una stringa e un numero in virgola mobile.
Passaggio 2
Creare una struttura contenente un membro dati per ogni campo identificato nel CSV. Usando la riga di esempio fornita di 1, "test", 34.5 avresti bisogno della seguente struttura:struct data { int col1; carattere *col2; galleggiante col3; };
Passaggio 3
Crea un metodo nel tuo programma che gestirà la lettura del file CSV. Questo dovrà essere accessibile al resto del tuo programma e probabilmente dovrà lavorare su strutture di dati comuni in modo che altri metodi possano accedere ai dati che sono stati letti. Passa il parametro per riferimento per rimuovere la necessità di un valore restituito . Un esempio di prototipo di funzione potrebbe essere:void ParseCSV( char *filename, data&input );
Passaggio 4
Includere l'intestazione IO standard utilizzando il codice seguente:#include
Passaggio 5
Includere la libreria di stringhe per consentire la manipolazione dei dati CSV utilizzando il codice seguente:#include
Passaggio 6
Crea un oggetto file, che leggerà i dati, utilizzando il codice seguente:FILE * pInput;
Passaggio 7
Crea un buffer di caratteri abbastanza grande da contenere una riga del file alla volta. A causa dei vincoli del linguaggio, il modo più semplice per farlo è dichiarare un array di caratteri di dimensioni sufficientemente grandi, come con:#define BUFFER_SIZE 1024
char buff[BUFFER_SIZE];
Passaggio 8
Apri il file con il codice seguente e assegnalo all'oggetto FILE creato in precedenza:pInput =fopen("filename", "r")
Passaggio 9
Leggi in una riga del file utilizzando il codice seguente:
fgets(buf, sizeof(buf), pInput)
Passaggio 10
Analizza il CSV usando la funzione "strtok". Crea una nuova stringa di caratteri per puntare ai token e inizializzala con i dati della riga letta sopra:char *tok =strtok(buf, ",")
Passaggio 11
Converti il token ricevuto nei dati appropriati. Utilizzando la riga di esempio:1, "test", 3.45 converti i dati contenuti in "tok" in un numero intero utilizzando il codice seguente:row.col1 =atoi(tok);
Passaggio 12
Per le letture successive dalla stessa riga, passa a "strtok" un parametro NULL invece della stringa del buffer che hai letto prima:tok =strtok(NULL, ",") Quindi, converti il token nel tipo di dati appropriato. Usando l'esempio riga 1,"test",3.45 Il codice di analisi per una singola riga sarebbe:char *tok =strtok(buf, ","); riga.col1 =atoi(tok); tok =strtok(NULL, ","); riga.col2 =tok; tok =strtok(NULL, ","); riga.col3 =atof(tok);
Passaggio 13
Eseguire questa operazione per tutte le voci su ciascuna riga del CSV. La funzione "strtok" continuerà a fornire i dati tra i valori della virgola finché non esaurisce i dati nel buffer, a quel punto restituirà NULL. Questo indicherà che hai finito con la linea.
Suggerimento
Incapsula la conversione dei dati in un altro metodo per rendere il codice più leggibile. Il metodo "fgets" restituirà NULL quando il file è stato completamente letto. Usalo in un ciclo while per attraversare l'intero file.
Avviso
La funzione "fopen" potrebbe restituire NULL se si è verificato un errore:assicurati di controllare il tuo file prima di usarlo. In alcuni casi, i token forniti potrebbero non essere del formato previsto. Assicurati di esaminare i tuoi dati prima della conversione cieca controllando i valori di errore comuni (stringa vuota, NULL, ecc.).