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 :

Problème avec lecture de fichier


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 20
    Points : 17
    Points
    17
    Par défaut Problème avec lecture de fichier[Résolu]
    Bonjour,

    Je dispose d'un fichier csv que je doit exploiter.
    Il est donc de la forme suivante :

    nom;prenom;adresse;type;lieu
    nom1;prenom1;adresse1;type1;lieu1
    ...

    J'aimerais afficher uniquement toutes les adresses, mais je ne vois pas du tout comment procéder. Voici le code que j'ai actuellement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     std::ifstream fichier("fichier.csv");
        std::string nom,prenom,adresse,type,lieu;
        std::string ligne;
        while ( std::getline( fichier,ligne) )
        {
            istringstream li(ligne);
            li >> nom >> prenom >> adresse >> type >> lieu;
            cout << adresse<<endl;
        }
    Ce code ne fonctionne uniquement si à la place du "; il y avait des espaces. Comment indiquer le fait que le séparateur soit ";" ?

    Merci à vous.
    Anthony

  2. #2
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    bonjour,
    je remplacerai les ';' par des espaces dans la string avant de déclarer le istream...

  3. #3
    Membre averti Avatar de vikki
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    292
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 292
    Points : 302
    Points
    302
    Par défaut
    Hello,
    Tu peux toujours utiliser boost::tokenizer pour parser ta chaine. Regarde sur la doc officielle, ce que tu cherche dois figurer dans les premiers exemples. Ou remplacer les ; par des espaces, ca marche aussi .

  4. #4
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    D'autant qu'un CSV, .... faut aussi prendre en compte les escaped values....

    Genre:

    "toto, et, tata","moi"

    Ca fait 2 records, et pas 4.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    Salut,

    Ce qu'il y a de bien avec getline, c'est que l'on peut tout à fait choisir n'importe quel symbole comme séparateur

    Ainsi, on pourrait très bien envisager d'utiliser le symbole ";" pour déterminer à quel moment la lecture doit s'arreter, sous une forme proche de
    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
    void foo(std::string const & filename)
    {
        std::ifstream ifs(filename.c_str());
        std::string read;
        /* lisons les lignes du fichier une à une, tant qu'il y en a */
        while(std::getline(ifs,read))
        {
            /* passons la chaine lue dans un flux de conversion */
            std::stringstream ss;
            ss<<read;
            /* et réutilisons getline, en précisant de s'arreter à chaque ; 
             * Tant qu'à faire, même si ce n'est pas pour les utiliser
             * autant récupérer les autres informations (entre autres pour
             * nous permettre de vérifier le format du fichier) :D*/
            std::string nom;
            std::string prenom;
            std::string address;
            std::string type;
            std::string lieu;
            if(!std::getline(ss,nom,';')
                throw BadFormat();
            if(!std::getline(ss,prenom,';')
                throw BadFormat();
            if(!std::getline(ss,address,';')
                throw BadFormat();
            if(!std::getline(ss,type,';')
                throw BadFormat();
            if(!std::getline(ss,lieu)
                throw BadFormat();
            std::cout<<address<<std::endl;
     
        }
    }
    Une autre solution pourrait consister, si tu es sur de la validité du fichier, à chercher les séparateurs qui entourent l'information qui t'intéresse, sous une forme proche de
    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
    void bar(std::string const & filename)
    {
        std::ifstream ifs(filename.c_str())
        std::string read;
        while(std::getline(ifs,read)
        {
             /* supprimons les informations qui se trouvent avant l'adresse */
             for(int i=0;i<2;++i)
                 read=read.substr(read.find(';')+1);
             /* et les informations qui suivent l'adresse */
    	str=str.substr(0,str.find(';'));
            /* YAPUKA afficher ce qui reste */
    	std::cout<<str<<std::endl;
        }
    }
    NOTA: il y a surement d'autres solutions, mais ces deux-ci te permettent, au moins, d'arriver à un résultat sans devoir commencer à modifier tout ton fichier...

    D'autant plus que, en y réfléchissant, il est fort vraisemblable que certaines adresses soient composées d'espace (par exemple rue de la poupée qui tousse, 142/15) ce qui t'interdira d'utiliser l'espace comme séparateur
    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

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par anthonyplay Voir le message
    Ce code ne fonctionne uniquement si à la place du "; il y avait des espaces. Comment indiquer le fait que le séparateur soit ";" ?
    Salut,
    cf ici.

  7. #7
    Membre à l'essai
    Inscrit en
    Juillet 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 20
    Points : 17
    Points
    17
    Par défaut
    Merci pour votre aide mon problème est résolu. J'ai utilisé successivement plusieurs getline sur le même istreamstring.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par koala01 Voir le message
    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
     
      while(std::getline(ifs,read))
        {
            std::stringstream ss;
            ss<<read;
            std::string nom;
            std::string prenom;
            std::string address;
            std::string type;
            std::string lieu;
            if(!std::getline(ss,nom,';')
                throw BadFormat();
            if(!std::getline(ss,prenom,';')
                throw BadFormat();
            if(!std::getline(ss,address,';')
                throw BadFormat();
            if(!std::getline(ss,type,';')
                throw BadFormat();
            if(!std::getline(ss,lieu)
                throw BadFormat();
            std::cout<<address<<std::endl;
        }
    }
    Avec des csv, il est souvent judicieux de mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::getline(ss,lieu';')
    pour le dernier champ.

    L'idée est que si le délimiteur n'est pas trouvé, getline() lira de toutes facons jusqu'à la fin de la chaine, qui correspond ici à la fin de l'enregistrement, puisqu'on charge le fichier ligne à ligne.

    De cette manière, on peut sauter d'éventuels champs après lieu, et surtout éviter le cas ennuyeux dans lequel un éditeur de .csv (Excel pour ne pas le nommer) ajoute des ';' à la fin du dernier champ...

    Dans ce contexte, toutes les lignes suivantes seront lues

    nom;prenom;adresse;type;lieu
    nom;prenom;adresse;type;lieu;
    nom;prenom;adresse;type;lieu;autrechose
    nom;prenom;adresse;type;lieu;;

    Francois

Discussions similaires

  1. problème avec lecture de fichiers
    Par Porteuris dans le forum Débuter
    Réponses: 11
    Dernier message: 10/02/2009, 08h05
  2. Réponses: 4
    Dernier message: 19/09/2008, 10h04
  3. Problème de lecture de fichier .txt avec Flash
    Par cdevl32 dans le forum Flex
    Réponses: 0
    Dernier message: 25/05/2008, 17h35
  4. Problême avec lecture tous fichier Vista
    Par babeth38 dans le forum Windows Vista
    Réponses: 4
    Dernier message: 03/04/2008, 09h06
  5. [DOM4J] Problème de lecture de fichier xml avec dom4j
    Par santana2006 dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 05/04/2006, 16h52

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