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 :

Parsing fichier CSV


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre �clair�
    Inscrit en
    Mai 2006
    Messages
    330
    D�tails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par d�faut Parsing fichier CSV
    Salut,

    J'ai un tableau excel (format CSV - champs s�par�s par des ";") � parser.

    Y aurait-il une m�thode plus rapide que de lire chaque ligne (avec std::getline()) et d'en extraire les champs en cherchant leurs positions de d�part et de fin (avec string::find_first_of()) puis en extrayant une sous-chaine de la ligne (avec string::substr()) ?

    Merci

  2. #2
    Membre �m�rite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par d�faut
    Ben �a d�pend. Faudrait d�j� que tu nous montres un morceau de fichier csv comme exemple (excuse nous, tout le monde ne connait pas par c�ur la syntaxe de tous les fichiers office, crois le ou non tout le monde n'utilise m�me pas office) ainsi que ton code, on pourra alors faire apparaitre d'�ventuels probl�mes d'optimisation.
    Dans l'absolu, une bonne m�thode pour analyser un texte rapidement est tout simplement d'utiliser les techniques ancestrales mises au point il y a des ann�es dans ce but, bref tout ce qui se rapporte � la compilation. Il y a quelques tutos bien foutus sur le site qui en parlent (cherche dans la partie algorithmique). Normalement pour un truc aussi simple un petit analyseur lexical avec un peu de bricolage par dessus (pour pas avoir � se taper un analyseur syntaxique complet) serait ce qui se fait de mieux. En plus quand on a fait un lexer on les a tous faits, et �a a toujours son utilit�, alors ce n'est pas de l'effort d'apprentissage d�pens� pour rien.

  3. #3
    Membre �clair�
    Inscrit en
    Mai 2006
    Messages
    330
    D�tails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par d�faut
    Citation Envoy� par zais_ethael Voir le message
    Ben �a d�pend. Faudrait d�j� que tu nous montres un morceau de fichier csv comme exemple
    Ben c'est tr�s simple, si mon tableau excel est constitu� de 3 lignes et 2 colonnes le fichier CSV est de style :

    valeur(1, 1);valeur(1,2) retour � la ligne
    valeur(2, 1);valeur(2,2) retour � la ligne
    valeur(3, 1);valeur(3,2) retour � la ligne

    o� valeur(i, j) est la valeur de la cellule � la ligne i et la colonne j.

  4. #4
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut,

    En fait, tout d�pendra sans doute du type des valeurs de tes diff�rentes colonnes/lignes, ainsi que de ta (ton in)certitude que toutes les lignes et toutes les colonnes sont bien remplies, et, enfin, de l'�ventuelle pr�sence de cellules dans lesquelles il y aurait des r�sultats calcul�s (totaux et autres).

    Si tu as la certitude que toutes les cellules attendues sont correctement remplies, tu peux envisager de lire directement les informations du type attendu pour chaque cellule, mais cela signifie courir le risque que ton fichier ait �t� corrompu, avec � la cl� certaines incoh�rences potentielles au niveau des donn�es lues.

    Ainsi, le code suivant va cr�er un fichier cvs ressemblant aux informations que tu as fournie, mais uniquement sous la forme de valeur enti�res puis le relire et placer dans un tableau de tableaux d'entier, pour enfin les r�afficher.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    #include <iostream>
    #include <fstream>
    #include <vector>
    using namespace std;
    /* fonction de création du fichier cvs
     * s'assurant que toutes les lignes de toutes les colonnes sont remplies
     */
    void createCVS()
    {
        ofstream ofs("essai.cvs");
        for(size_t i=0;i<10;i++)
        {
            for(size_t j=0;j<10;j++)
            {
                    ofs<<i*10+j;
                    if(j==9)
                        ofs<<endl;
                    else
                        ofs<<" ; ";
            }
        }
    }
    /* fonction delecture du fichier cvs précédemment créé 
     */
    void readCVS(vector< vector<size_t> >& tab)
    {
        ifstream ifs("essai.cvs");
        for(size_t i=0;i<10; i++)
        {
            vector<size_t> ligne;
            for(size_t j=0;j<10;j++)
            {
                char space;
                size_t entier;
                ifs>>entier;
                ligne.push_back(entier);
                if(j<9)
                    ifs>>space;
            }
            tab.push_back(ligne);
        }
    }
    int main()
    {
        vector< vector<size_t> > tab;
        createCVS();
        readCVS(tab);
        /* affichage des informations récupérées 
         */
        for(vector<vector< size_t> >::const_iterator it=tab.begin();
            it!=tab.end();it++)
        {
            for(size_t cpt=0;cpt< (*it).size();cpt++)
                cout<<(*it)[cpt]<<" ";
            cout<<endl;
        }
        return 0;
    }
    Comme on peut �tre sur que toutes les cellules et toutes les colonnes sont correctement remplies, et qu'il n'y aura donc aucun probl�me, on peut �viter toutes les v�rifications fastidieuses de coh�rence du fichier

    S'il y avait eu des types de donn�es diff�rents dans les colonnes, nous aurions tr�s bien pu envisager de cr�er une classe qui aurait contenu les diff�rentes donn�es, et d'utiliser seulement un tableau du type de cette classe...

    Par contre, s'il n'y a ne serait-ce qu'un seul risque pour qu'une colonne n'existe pas - ou qu'une colonne suppl�mentaire fasse son apparition, ou que le fichier soit corrompu, voire, tout simplement, que le ";" arrive directement apr�s le dernier caract�re r�el de la chaine, ou qu'une chaine soit entour�e de guillemets - alors, tu devra commencer � mettre certains m�canismes plus complexes en �uvre pour r�cup�rer tes donn�es
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  5. #5
    Membre �prouv�
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    107
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 107
    Par d�faut
    je te conseille de ne pas perdre ton temps � parser toi-m�me un fichier CSV (il y a des pi�ges), mais d'utiliser une lib :
    http://sourceforge.net/projects/libcsv/

  6. #6
    Membre �clair�
    Inscrit en
    Mai 2006
    Messages
    330
    D�tails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par d�faut
    Citation Envoy� par lemmel Voir le message
    je te conseille de ne pas perdre ton temps � parser toi-m�me un fichier CSV (il y a des pi�ges), mais d'utiliser une lib :
    http://sourceforge.net/projects/libcsv/
    Je vais jter un oeil, mais y a t-il une bonne raion que �a aille plus vite que de parser soi-m�me ? car le code je l'ai d�j� �crit et �a marche bien...c'est juste que j'aimerais qu'il soit plus rapide.

  7. #7
    Membre �clair�
    Inscrit en
    Mai 2006
    Messages
    330
    D�tails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par d�faut
    Citation Envoy� par koala01 Voir le message
    ...
    Oui, en fait �a ne convint pas tout � fait car je ne connais pas le type (chaine, entier, flottant) d'une cellule et en plus il peut y avoir des trous dans le tableau.

Discussions similaires

  1. NullPointerExecption lors du parsing d'un fichier csv
    Par RTK45 dans le forum Entr�e/Sortie
    R�ponses: 3
    Dernier message: 27/04/2013, 19h58
  2. Parse du fichier CSV : Optimisation Vs. Nombres de lignes
    Par aelmalki dans le forum G�n�ral Java
    R�ponses: 4
    Dernier message: 04/03/2011, 13h31
  3. [RegEx] Parsing de fichier csv
    Par Khamsin dans le forum Langage
    R�ponses: 2
    Dernier message: 10/02/2011, 12h13
  4. Mise � jour d'une table avec un fichier csv
    Par blackangel dans le forum PostgreSQL
    R�ponses: 4
    Dernier message: 26/05/2005, 14h46
  5. R�ponses: 2
    Dernier message: 14/05/2004, 12h55

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