Comment lire un fichier CSV en C
De nombreux produits logiciels traitant des nombres et des calculs ont la capacité de générer des données dans un fichier CSV (Comma Separated Value). Ce format peut être un moyen efficace de transporter des données entre différents programmes, car il est lisible et assez facile à manipuler. De nombreux programmes C qui traitent des données devront probablement lire à partir d'un fichier CSV à un moment donné.
Étape 1
Consultez la documentation du programme qui fournit le fichier CSV. Déterminez le nombre de champs dans chaque ligne, ainsi que le format de chaque champ. Par exemple, si un programme fournit un CSV avec les données suivantes :1, "test", 34.5 Vous marqueriez trois champs :un entier, une chaîne et un nombre à virgule flottante.
Étape 2
Créez une structure contenant un membre de données pour chaque champ identifié dans le CSV. En utilisant la ligne d'exemple fournie de 1, "test", 34.5, vous auriez besoin de la structure suivante :struct data { int col1; caractère *col2 ; flotteur col3 ; } ;
Étape 3
Créez une méthode dans votre programme qui gérera la lecture du fichier CSV. Cela devra être accessible au reste de votre programme et devra probablement travailler sur des structures de données communes afin que d'autres méthodes puissent accéder aux données qui ont été lues. Passez le paramètre par référence pour supprimer le besoin d'une valeur de retour . Un exemple de prototype de fonction serait :void ParseCSV( char *filename, data&input );
Étape 4
Incluez l'en-tête IO standard en utilisant le code suivant :#include
Étape 5
Incluez la bibliothèque de chaînes pour permettre la manipulation des données CSV à l'aide du code suivant :#include
Étape 6
Créez un objet fichier, qui lira les données, en utilisant le code suivant :FILE * pInput;
Étape 7
Créez un tampon de caractères suffisamment grand pour contenir une ligne du fichier à la fois. En raison des contraintes du langage, la manière la plus simple de procéder consiste à déclarer un tableau de caractères d'une taille suffisamment grande, comme avec :#define BUFFER_SIZE 1024
char buf[BUFFER_SIZE] ;
Étape 8
Ouvrez le fichier avec le code suivant et affectez-le à votre objet FILE créé précédemment :pInput =fopen("filename," "r")
Étape 9
Lire une ligne du fichier en utilisant le code suivant :
fgets(buf, sizeof(buf), pInput)
Étape 10
Analysez le CSV à l'aide de la fonction "strtok". Créez une nouvelle chaîne de caractères pour pointer vers les jetons et initialisez-la avec les données de la ligne lue ci-dessus :char *tok =strtok(buf, ",")
Étape 11
Convertissez le jeton reçu en données appropriées. En utilisant la ligne d'exemple :1, "test", 3.45 convertissez les données contenues dans "tok" en un entier en utilisant le code suivant :row.col1 =atoi(tok);
Étape 12
Pour les lectures suivantes à partir de la même ligne, passez "strtok" un paramètre NULL au lieu de la chaîne de tampon que vous avez lue auparavant :tok =strtok(NULL, ",") Ensuite, convertissez le jeton dans le type de données approprié. En utilisant l'exemple ligne 1,"test",3.45 Le code d'analyse pour une seule ligne serait :char *tok =strtok(buf, ","); ligne.col1 =atoi(tok); tok =strtok(NULL, ","); ligne.col2 =tok; tok =strtok(NULL, ","); ligne.col3 =atof(tok);
Étape 13
Faites cela pour toutes les entrées sur chaque ligne du CSV. La fonction "strtok" continuera à fournir les données entre les valeurs de virgule jusqu'à ce qu'elle soit à court de données dans le tampon, auquel cas elle renverra NULL. Cela indiquera que vous avez terminé avec la ligne.
Astuce
Encapsulez votre conversion de données dans une autre méthode pour rendre le code plus lisible. La méthode "fgets" renverra NULL lorsque le fichier aura été complètement lu. Utilisez ceci dans une boucle while pour parcourir tout le fichier.
Avertissement
La fonction "fopen" peut renvoyer NULL en cas d'erreur -- assurez-vous de vérifier votre fichier avant de l'utiliser. Dans certains cas, les jetons fournis peuvent ne pas être au format attendu. Assurez-vous d'examiner vos données avant de convertir aveuglément en vérifiant les valeurs d'erreur courantes (la chaîne vide, NULL, etc.).