IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Lecture CSV en C++, le faire « comme il faut »


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut Lecture CSV en C++, le faire « comme il faut »
    Bonjour,

    Je vous présente un article qui, à partir d’un problème simple, présente la méthodologie et les techniques à mettre en œuvre pour arriver à une solution performante, réutilisable.

    http://julien-blanc.developpez.com/t...cture-csv-c++/

    Bonne lecture

  2. #2
    Membre Expert
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Par défaut
    Bonjour,

    c'est un très bon sujet d'article ; la lecture d'un fichier CSV (un vrai, avec tous les pièges qu'il peut contenir) est parfois faite de manière bien bancale .

  3. #3
    Membre très actif
    Homme Profil pro
    nop
    Inscrit en
    Mars 2015
    Messages
    436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : nop
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2015
    Messages : 436
    Par défaut importer un fichier CSV en c++
    très bon article !

    un BigUp! pour la partie qui traite de l'importance de la taille du fichier, qui va conditionner la méthode de lecture. On ne le dira jamais assez traiter un fichier de 400Go sur une machine perso n'est pas pareil que de le faire sur un serveur virtualisé mutualisé ou de prod. Sans parler du problème de cache, de mémoire, du temp, de ressources par utilisateur.....

    Une petite astuce personnel:
    maintenant je traite le problème d'encodage manuellement avec un éditeur à part, car souvent, trop souvent on tombe sur des fichiers CSV multi-encodage qui ont été mal gérés par les exportateurs....
    Oui alors avant l’entrée dans la boucle, penser à une fonction juste pour tester l’intégralité du bon codage (et par la même occasion l’intégralité du fichier au cas où il est défectueux)

    Une petite amélioration pour l'article: vous ne parlez pas de la source (disque dur, réseau, nas, lien dropbox, lien cloud..etc) du fichier et de son impact, de son traitement en tâche de fond plutôt qu'en foreground.

  4. #4
    Membre éclairé
    Homme Profil pro
    Cocher moderne
    Inscrit en
    Septembre 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Oman

    Informations professionnelles :
    Activité : Cocher moderne

    Informations forums :
    Inscription : Septembre 2006
    Messages : 50
    Par défaut
    Excellent, j'en avais justement besoin !
    Merci beaucoup ! Ça va m'éviter quelques heures d'arrachage de cheveux et quelques litres de café...

  5. #5
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par MichaelREMY Voir le message
    Une petite amélioration pour l'article: vous ne parlez pas de la source (disque dur, réseau, nas, lien dropbox, lien cloud..etc) du fichier et de son impact, de son traitement en tâche de fond plutôt qu'en foreground.
    La partie VI en parle, ou du moins donne des éléments de réponse : la source des données n'a pas d'impact (autre que les performances : on peut pas traiter les données plus rapidement qu'elles arrivent).

    Si tu veux faire tes traitements de manière asynchrone, rien ne change non plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Threadpool pool; // ou autre
     
    CSVParser parser;
    parser.onField([](std::string const& f) { std::cout << f << std::endl; }); // traitement synchrone
    parser.onField([&](std::string const& f) { pool.enqueue([f]() { std::cout << f << std::endl; }); }); // traitement asynchrone
     
    std::vector<char> data;
    for(auto c: data) {
       parser.consume(c);
    }

  6. #6
    Membre très actif
    Homme Profil pro
    nop
    Inscrit en
    Mars 2015
    Messages
    436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : nop
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2015
    Messages : 436
    Par défaut
    Citation Envoyé par Iradrille Voir le message
    La partie VI en parle, ou du moins donne des éléments de réponse : la source des données n'a pas d'impact (autre que les performances : on peut pas traiter les données plus rapidement qu'elles arrivent).

    Si tu veux faire tes traitements de manière asynchrone, rien ne change non plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Threadpool pool; // ou autre
     
    CSVParser parser;
    parser.onField([](std::string const& f) { std::cout << f << std::endl; }); // traitement synchrone
    parser.onField([&](std::string const& f) { pool.enqueue([f]() { std::cout << f << std::endl; }); }); // traitement asynchrone
     
    std::vector<char> data;
    for(auto c: data) {
       parser.consume(c);
    }
    oui oui, je voulais juste dire qu'avant d'importer le fichier, il faut s'assurer, ou plutôt estimer la longeur de la large pour ne pas monopoliser (ou plutôt ennuyer l'utilisateur devant l'écran) et ainsi traiter le tout en background permettant ainsi d'afficher une chrono, une jauge. Comem fait maintenant Youtube pour l'import des vidéos. Rappelez-vous avant (dans les années 2000) où on attendez devant l'écran que l'upload se finisse pour remplir le formulaire et ensuite faire autre chose.... C'es ce point là que je voulais mettre en avant : estimer avant de travailler, même un traitement d'apparence simple...
    c'est un très bon article-tuto que vous avez écrit là.

  7. #7
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par MichaelREMY Voir le message
    oui oui, je voulais juste dire qu'avant d'importer le fichier, il faut s'assurer, ou plutôt estimer la longeur de la large pour ne pas monopoliser (ou plutôt ennuyer l'utilisateur devant l'écran) et ainsi traiter le tout en background permettant ainsi d'afficher une chrono, une jauge...
    Ce qui n'a strictement aucun rapport avec le parseur, mais avec la manière dont il est utilisé, donc complètement hors de propos.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

Discussions similaires

  1. Que peux-t'on faire comme application ?
    Par lalystar dans le forum Java ME
    Réponses: 2
    Dernier message: 11/12/2004, 05h36
  2. [maintenance][performance] Que faire comme maintenance ?
    Par woodwai dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 06/11/2003, 15h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo