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 :

Trier le contenu d'un fichier .csv


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 41
    Points : 26
    Points
    26
    Par défaut Trier le contenu d'un fichier .csv
    Bonjour,
    Voilà, on me demande de récupérer une partie du contenu d'un fichier .csv en langage C/C++ (C++ préféré), mais je débute tout juste dans le C++ et je ne voit pas trop comment faire :s.

    Le .csv se compose par colonnes de la facon suivante:
    TITRE MAGAZINE;NOMBRE DE PAGE;CODE;TARIFS


    Je dois récupérer le TITRE MAGAZINE et le TARIFS.
    Tout le code que j'ai fait est en C et consiste pr le moment à ouvrir le fichier, à le lire et à récupérer son contenu dans un fichier .txt.
    Par contre je ne voit pas comment choisir ce que je veux récupérer.
    Je suis parti sur le principe que chaque colonne est séparée par un ";", je me suis dit qu'il fallait faire une condition mais comment indiquer au programme à partir de quel ";" il doit écrire dans le .txt ce qu'il lit?

    Est-ce la bonne méthode? une bonne idée ou il y a t'il une meilleure solution?

    Merci d'avance de votre aide

    Kira

  2. #2
    Membre actif Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Points : 288
    Points
    288
    Par défaut
    Pour commencer :
    - utilisation de std::stringstream pour la lecture du fichier.
    - utilisation de std::getline pour lire chaque champ séparé par un point virgule.

    Voilà, si tu as besoin d'approfondissement, n'hésite pas...

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 41
    Points : 26
    Points
    26
    Par défaut
    Bonjour et merci pour vos pistes

    Donc tout dabord, j'ai essayé la fonction getline; cependant, je ne vois pas quels paramètres lui passer.
    Car j'ouvre tout dabord mon fichier avec un "fichier = fopen" etc..., je test si l'ouverture s'est bien passée, et la j'incorpore le getline de la facon suivante:
    getline(ligne, fichier1)
    en ayant déclaré plus haut "ligne" comme un type char.
    Je fais suivre celà d'un "cout << ligne << endl;" mais je me retrouve avec des erreurs de compilations:
    Erreur 5 error C2780: 'std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &,std::basic_string<_Elem,_Traits,_Alloc> &)'*: 3 arguments attendus - 2 fournis c:\documents and settings\bastien\bureau\projet(s) en cours\tri titres-tarifs\tri titres-tarifs\tri titres-tarifs.cpp 50

    Erreur 6 error C2784: 'std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &,std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem)'*: impossible de déduire l'argument modèle pour 'std::basic_istream<_Elem,_Traits> &' à partir de 'char **' c:\documents and settings\bastien\bureau\projet(s) en cours\tri titres-tarifs\tri titres-tarifs\tri titres-tarifs.cpp 50


    Ensuite, pour ce qui est du stringstream, je ne vois pas du tout comment l'utiliser :s, j'ai cherché un peu sur google et le seul exemple qui me parle c'est celui ci => http://www.normalesup.org/~charpiat/cours/node65.html
    Mais bon je ne comprend pas tout et je pense que ce n'est pas le meilleur exemple non plus.

    Si vous pouviez m'éclairer un peu la dessus ca serait sympas .

    Merci encore pour ces deux pistes, je continue de chercher malgré tout

    Kira

  4. #4
    Membre actif Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Points : 288
    Points
    288
    Par défaut
    en fait, tu mixes 2 choses :
    fopen qui provient du C et qui retourne un FILE*
    et std::getline qui provient de la std C++ qui travaille sur les streams (flux) C++.

    Alors choisis ta voie, je peux t'aider pour les 2 ...

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 41
    Points : 26
    Points
    26
    Par défaut
    Ha ok.

    Bon bha etant donné que c'est demandé en C++ autant continuer la dedans.
    Donc j'oubli le fopen et le remplace par std::stringstream c'est ca?
    Pourrais je juste avoir quelques explication quant à cette fonction?

    Merci

  6. #6
    Membre actif Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Points : 288
    Points
    288
    Par défaut
    pour la lecture d'une fichier ligne par ligne je te renvoie a la faq C++:
    http://cpp.developpez.com/faq/cpp/?p...ture_par_ligne

    Ensuite, pour le "découpage", il faut encapsuler la ligne (qui est de type std::string) par un objet std::stringstream pour que std::getline puisse opérer dessus.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 41
    Points : 26
    Points
    26
    Par défaut
    Bon alors, voilà ce que j'ai fais:

    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    /////////////////////
    /// Bibliothèques ///
    /////////////////////
     
    #include <stdafx.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string>
    #include <string.h>
    #include <fstream>
    #include <iostream>
    #include <sstream>
    using namespace std;
     
     
    ////////////////////////////////
    /// Déclaration de Variables ///
    ////////////////////////////////
     
    string colonne1;
    string colonne2;
    string colonne3;
    string colonne4;
    string colonne5;
    string colonne6;
    string colonne7;
    string colonne8;
     
     
    ///////////////////////////
    /// Programme Principal ///
    ///////////////////////////
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	ifstream fichier1("C:\\Documents and Settings\\bastien\\Bureau\\Offres - Tables EDI Excel\\20090727-TABLES_EDI.csv");
     
    	if(fichier1 != NULL)
    	{
    		string ligne; // variable contenant chaque ligne lue
     
            // cette boucle s'arrête dès qu'une erreur de lecture survient
            while ( getline( fichier1, ligne, ';' ) )
            {
    			getline( fichier1, colonne1, ';' );
                //cout << colonne1 << endl;
     
    			getline( fichier1, colonne2, ';' );
                //cout << colonne2 << endl;
     
    			getline( fichier1, colonne3, ';' );
                //cout << colonne3 << endl;
     
    			getline( fichier1, colonne4, ';' );
                //cout << colonne4 << endl;
     
    			getline( fichier1, colonne5, ';' );
                //cout << colonne5 << endl;
     
    			getline( fichier1, colonne6, ';' );
                //cout << colonne6 << endl;
     
    			getline( fichier1, colonne7, ';' );
                //cout << colonne7 << endl;
     
    			getline( fichier1, colonne8);
                //cout << colonne8 << endl;
     
    			cout << colonne1 << "\t" << colonne4 << endl;
            }
    	}
    	else
    		cout << "Erreur lors de l'ouverture du fichier 20090727-TABLES_EDI.csv" << endl;
    	return 0;
    }

    Getline est en effet très pratique quand on sait l'utiliser.
    Après je pense qu'il y a moyen de réduire tout ca mais bon je suis déjà assez content.

    Merci encore Grulim tu m'a bien aidé

  8. #8
    Membre actif Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Points : 288
    Points
    288
    Par défaut
    Puis-je ajouter quelques petites choses (pour améliorer ton code)...

    Sans vouloir d'offenser, je pense que tu vas un peu vite en besogne quand tu mets au niveau du while, un getline avec ';', puisqu'on veut la ligne entière.
    Ensuite, lorsque tu as autant de colonnes, utilise plutôt un vecteur de chaine de caractère.
    Et enfin, ne met que les #include qui te sont réellement utiles (stdio.h, string.h ... sont superflus)

    Ce ne sont bien sur que quelques conseils amicaux.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 41
    Points : 26
    Points
    26
    Par défaut
    Non ne t'inquiètes pas, au contraire je suis ouvert aux critiques^^.

    Oui il est vrai que pour le getline je suis aller un peu vite car je me suis rendu compte qu'il ne prenait pas les bonnes colonnes, j'ai donc enlevé le ";" présent dans le while.
    J'ai également supprimé les bibliothèques superflux (à force de tester telle ou telle fonction j'en étais en effet arrivé à mettre beaucoup de lib).

    Ensuite pour ce qui est des vecteurs de chaine de caracteres, heu...la je n'ai pas la moindre idée de ce dont tu parles ^^. Mais bon, étant en soif d'apprendre je m'en vais de ce pas regarder sur le forum.

    Merci encore de ton aide et de tes conseils

  10. #10
    Membre actif Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Points : 288
    Points
    288
    Par défaut
    un truc du genre :
    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
    	std::istringstream stmIn(
    		"toto1;titi1;tata1;tutu1\n"
    		"toto2;titi2;tata2;tutu2\n"
    		"toto3;titi3;tata3;tutu3\n"
    		"toto4;titi4;tata4;tutu4\n"
    		"toto5;titi5;tata5;tutu5\n"
    		"toto5;titi6;tata6;tutu6\n" );
    	std::string ligne;
     
    	while( std::getline( stmIn, ligne ) )
    	{
    		std::string champ;
    		std::vector<std::string> champs;
    		std::istringstream stmLigne( ligne );
     
    		while( std::getline( stmLigne, champ, ';' ) )
    		{
    			champs.push_back( champ );
    		}
     
    		std::cout << "1=" << champs[0]
    			<< " 2=" << champs[1]
    			<< " 3=" << champs[2]
    			<< " 4=" << champs[3] << std::endl;
    	}
    champs est vecteur de chaines de caractères.

Discussions similaires

  1. Réponses: 6
    Dernier message: 05/02/2009, 09h34
  2. [CSV] Contenu d'un fichier csv ds un tableau php
    Par -Neo- dans le forum Langage
    Réponses: 2
    Dernier message: 19/09/2008, 17h02
  3. Réponses: 2
    Dernier message: 09/06/2007, 22h09
  4. vider le contenu d un fichier .csv
    Par lerab51 dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 24/05/2007, 09h05
  5. trier le contenu d'un fichier
    Par donny dans le forum Langage
    Réponses: 18
    Dernier message: 29/09/2006, 18h06

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