288 votes

Comment lire et analyser des fichiers CSV en C++ ?

Je dois charger et utiliser les données d'un fichier CSV en C++. À ce stade, il peut s'agir d'un analyseur de données délimitées par des virgules (c'est-à-dire qu'il ne faut pas se soucier de l'échappement des nouvelles lignes et des virgules). Le besoin principal est un analyseur ligne par ligne qui retournera un vecteur pour la ligne suivante à chaque fois que la méthode est appelée.

J'ai trouvé cet article qui semble assez prometteur : http://www.boost.org/doc/libs/1_35_0/libs/spirit/example/fundamental/list_parser.cpp

Je n'ai jamais utilisé Boost's Spirit, mais je suis prêt à l'essayer. Mais seulement s'il n'y a pas une solution plus directe que je néglige.

11 votes

J'ai regardé boost::spirit pour l'analyse syntaxique. Il est plus destiné à l'analyse grammaticale qu'à l'analyse d'un simple format de fichier. Quelqu'un de mon équipe a essayé de l'utiliser pour analyser le XML et c'était une douleur à déboguer. Ne vous approchez pas de boost::spirit si possible.

51 votes

Désolé Chrish, mais c'est un mauvais conseil. Spirit n'est pas toujours une solution appropriée mais je l'ai utilisé - et continue de l'utiliser - avec succès dans un certain nombre de projets. Comparé à des outils similaires (Antlr, Lex/yacc etc.) il a des avantages significatifs. Maintenant, pour analyser un CSV, c'est probablement trop...

4 votes

@MattyT IMHO spirit est assez difficile à utiliser pour une bibliothèque de combinateurs d'analyseurs. Ayant eu une certaine expérience (très agréable) avec Haskells (atto)parsec bibliothèques Je m'attendais à ce que (l'esprit) fonctionne aussi bien, mais j'ai abandonné après m'être battu avec des erreurs de compilation de 600 lignes.

28voto

Joel de Guzman Points 594

Il n'est pas exagéré d'utiliser Spirit pour analyser les CSV. Spirit est bien adapté aux tâches de micro-parsing. Par exemple, avec Spirit 2.1, il est aussi facile que :

bool r = phrase_parse(first, last,

    //  Begin grammar
    (
        double_ % ','
    )
    ,
    //  End grammar

    space, v);

Le vecteur, v, est rempli avec les valeurs. Il existe une série de tutoriels Nous avons abordé ce sujet dans la nouvelle documentation de Spirit 2.1 qui vient d'être publiée avec Boost 1.41.

Le tutoriel va du simple au complexe. Les analyseurs CSV sont présentés quelque part au milieu et abordent diverses techniques d'utilisation de Spirit. Le code généré est aussi précis qu'un code écrit à la main. Regardez l'assembleur généré !

18 votes

En fait, c'est exagéré, le temps de compilation est énorme et rend l'utilisation de Spirit pour de simples "tâches de micro-parsage" déraisonnable.

13 votes

Je tiens également à souligner que le code ci-dessus n'analyse pas le CSV, il analyse simplement une plage du type de vecteur délimitée par des virgules. Il ne gère pas les guillemets, les différents types de colonnes, etc. En bref, 19 votes pour quelque chose qui ne répond pas du tout à la question me semble un peu suspect.

9 votes

@Gerdiner Absurdité. Le temps de compilation pour les petits analyseurs n'est pas si important, mais il n'est pas non plus pertinent car vous placez le code dans sa propre unité de compilation et le compilez une fois . Il suffit ensuite de le relier et c'est aussi efficace que possible. Quant à votre autre commentaire, il y a autant de dialectes de CSV qu'il y a de processeurs pour ce format. Celui-ci n'est certainement pas un dialecte très utile mais il peut être étendu de manière triviale pour gérer les valeurs citées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X