Séparation par des virgules à l'aide de strtok en C: Comment traiter les fichiers CSV

Séparation par des virgules à l’aide de strtok en C: Comment traiter les fichiers CSV

Cet article traite du traitement des fichiers CSV à l’aide des fonctions C standard disponibles dans les bibliothèques string.h et stdio.h . Notez que dans les implémentations C ++, celles-ci sont généralement disponibles sous forme de bibliothèques cstring et cstdio .

Il y a trois sujets à traiter:

  • structure du programme – comment le programme se déroule;
  • lire le fichier – comment récupérer les données du fichier;
  • traitement de la ligne CSV – fractionnement d’une ligne de données en morceaux.

Le code peut nécessiter un ajustement pour la plate-forme, car certains fichiers contiennent des lignes terminées par CR / LF, mais tous les principes généraux peuvent être appliqués sur toutes les plates-formes.

Structure du programme

Le processus de lecture de fichier comprend les étapes suivantes:

  • ouvrez le fichier;
  • lire chaque ligne;
  • divisez chaque ligne;
  • stocker ou traiter les données;
  • répéter jusqu’à ce que la fin du fichier soit atteinte.

Le fichier peut être ouvert en utilisant la fonction standard fopen de stdio.h, en utilisant « rt » comme attributs (fichier texte, ouvert en lecture uniquement) et fermé avec la fonction fclose à la fin du processus.

Lire le fichier

La lecture des lignes du fichier est assez simple – string.h fournit des fgets qui liront jusqu’au caractère de nouvelle ligne standard pour la plate-forme compilée.

Ceci est généralement considéré comme la fonction la plus sûre à utiliser – fscanf n’est pas considéré comme très sûr par de nombreux programmeurs, mais il a un avantage clé: le caractère de fin de ligne peut être manipulé.

Si le programme est destiné à un usage interne, alors fgets devrait convenir. Sinon, il peut être préférable d’éviter fscanf et de lire et d’évaluer un caractère à la fois dans le fichier en utilisant fget , et en s’arrêtant au caractère de fin de ligne.

En supposant qu’il existe une confusion entre les lignes terminées CR / LF, CR et LF, ce qui précède est probablement la meilleure solution, car chaque caractère peut être testé par rapport à CR ou LF et la ligne considérée comme lue lorsque l’un d’entre eux est rencontré.

Dans le cas d’une ligne terminée CR / LF, tout ce qui se passera est qu’aucune donnée n’est lue!

Traitement de la ligne CSV

Pour traiter la ligne CSV, la fonction strtok peut être utilisée. Maintenant, de nombreux programmeurs considèrent que cela est potentiellement dangereux. Tant qu’il est utilisé correctement, cependant, en vérifiant les pointeurs NULL à chaque étape, cela devrait être parfaitement bien.

Le premier appel à strtok fournit les séparateurs, tandis que les appels suivants réutiliseront les séparateurs (avec le paramètre défini sur NULL), tels qu’ils sont appliqués au reste de la chaîne transmise à la fonction.

Chaque jeton (élément de données) doit ensuite être traité ou stocké, avant que le jeton suivant ne soit extrait. Lorsqu’il n’y a plus de données, l’appel à strtok n’échouera pas, mais renvoie NULL.

Adaptation à d’autres formats

Il existe d’autres formats – tels que TSV (Tab Separated Value) – qui peuvent bénéficier de l’approche mentionnée ici, simplement en changeant les caractères de séparation.

La tentation est de créer une fonction fourre-tout en mettant tous les caractères possibles dans la chaîne, mais le défaut majeur de cette approche est qu’il peut y avoir des caractères dans les données qui apparaissent également dans la chaîne de séparation de tokenisation.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *