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 :

Récupération données dans fichier csv


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut Récupération données dans fichier csv
    Bonjour,

    Je sollicite votre aide car j’ai un petit souci de connaissances et de compréhension.
    J’ai créé un programme qui lit deux fichiers csv et transfert les données dans des vectors.
    Jusque-là pas de soucis, le programme fonctionne.
    Ce que je n’arrive pas à faire :
    • Dans l’un des fichiers nous avons des caractères spéciaux (éèà….) que je n’arrive pas à récupérer et à afficher.
    • Je récupère les dates dans l’un des fichiers et les place dans un string. Je souhaiterais que ces dates soient bien considérées comme des dates, afin de pouvoir les manipuler (Tri ou calculs enter deux dates).
    Pourriez-vous m’aider s’il vous plaît ?
    Vous en remerciant par avance.

    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    #include <iostream>
     #include <cstdlib>
     #include <string>
     #include <locale>
     #include <iterator>
     #include <fstream>
     #include <sstream>
     #include <vector>
     #include <algorithm>
     #include <ctime>
     #include <set>
     #include <iomanip>
     
     
    using namespace std;
     
     int rec_countA = 0; //compteur adresses clients
     int rec_countB = 0; //compteur donnees financieres clients
    bool affichageDate(string& dateFormat, int& d, int& m, int& y);
     
    struct Company  // Structure stockant les informations postales du client
         {
         string societe;
         int compta;
         int site;
         string groupe;
         string fjuri;
         string nom;
         string enseigne;
         string adresse1 ;
         string adresse2;
         string cpost;
         string ville;
         string tel;
         string fax;
         string email;
         string siret;
              };
     
    vector <Company> companies; // Un tableau dynamique pour stocker les clients
     
    struct Balanceagee // Structure stockant les informations financieres du client
         {
         string societe;
         int compta;
         int site;
         string piece;
         string commande;
         string dateEcriture;
         string dateEcheance;
         double montant;
         string commercial;
         double soldeDue;
         };
     
    vector < Balanceagee > balClient; //Un tableau dynamique pour stocker les pieces comptables
     
    bool fonctionTriAdresseClient(const Company& a,const Company& b) // Tri des adresses pas numero de site
         {
         return a.site < b.site;
         }
     
    bool fonctionTriBalanceAgeeClient(const Balanceagee & a,const Balanceagee & b)  //Tri des factures pas numero de site
         {
         return a.site < b.site;
         }
     
     
    istream & operator >> (istream & company, Company & companies) //Flux fichier adresse envoye dans la structure Company
         {
         string compta;
         string site ;
         // Parsage du flux par un separateur et envoi des données dans les champs de la structure
         getline(company, companies.societe, ';');
         getline(company, compta, ';');
             istringstream incompta(compta); // Transpytage du string en int
             incompta >>  companies.compta;
         getline(company, site, ';');
             istringstream insite(site); // Transpytage du string en int
             insite >>  companies.site;
         getline(company, companies.groupe, ';');
         getline(company, companies.fjuri, ';');
         getline(company, companies.nom, ';');
         getline(company, companies.enseigne, ';');
         getline(company, companies.adresse1, ';');
         getline(company, companies.adresse2, ';');
         getline(company, companies.cpost, ';');
         getline(company, companies.ville, ';');
         getline(company, companies.tel, ';');
         getline(company, companies.fax, ';');
         getline(company, companies.email, ';');
         getline(company, companies.siret);
         return company;
         }
     
    istream & operator >> (istream & balanceAgeeClient, Balanceagee & balClient)  /*Flux fichier Balance agee envoye dans la structure Balanceagee */
         {
         string compta;
         string site;
         string piece;
         string commande;
         string montant;
         string soldeDue;
         // Parsage du flux par un separateur et envoi des données dans les champs de la structure
         getline(balanceAgeeClient, balClient.societe, ';');
         getline(balanceAgeeClient, compta, ';');
             istringstream incompta(compta); // Transpytage du string en int
             incompta >>  balClient.compta;
         getline(balanceAgeeClient, site, ';');
             istringstream insite(site);  // Transpytage du string en int
             insite >>  balClient.site;
         getline(balanceAgeeClient, balClient.piece, ';');
         getline(balanceAgeeClient, balClient.commande, ';');
         getline(balanceAgeeClient, balClient.dateEcriture, ';');
         getline(balanceAgeeClient, balClient.dateEcheance, ';');
         getline(balanceAgeeClient, montant, ';');
             replace(montant.begin(),montant.end(),',','.'); //Remplace le ',' en '.'
             montant.erase(remove(montant.begin(), montant.end(), ' '), montant.end()); //supprime les espaces
            istringstream inmontant (montant); // Transpytage du string en float
             inmontant >>  balClient.montant;
         getline(balanceAgeeClient, balClient.commercial, ';');
         getline(balanceAgeeClient, soldeDue, ';');
             replace(soldeDue.begin(),soldeDue.end(),',','.'); //Remplace le ',' en '.'
             soldeDue.erase(remove(soldeDue.begin(), soldeDue.end(), ' '), soldeDue.end()); //supprime les espaces
             istringstream insoldeDue (soldeDue); // Transpytage du string en float
             insoldeDue >>  balClient.soldeDue;
         return balanceAgeeClient;
         }
     
    ostream & operator << (ostream & flux, Company const & companies) // Affichage des donnees de la structure Company
         {
         flux
         << left << setfill(' ') << setw(15)<< companies.societe << " "
         << left << setfill(' ') << setw(10)<< companies.compta << " "
         << left << setfill(' ') << setw(10)<< companies.site << " "
         << left << setfill(' ') << setw(5)<< companies.groupe  <<  " "
         << left << setfill(' ') << setw(5)<< companies.fjuri << " "
         << left << setfill(' ') << setw(15)<< companies.nom << " "
         << left << setfill(' ') << setw(15)<< companies.enseigne << " "
         << left << setfill(' ') << setw(15)<< companies.adresse1 << " "
         << left << setfill(' ') << setw(15)<< companies.adresse2 << " "
         << left << setfill(' ') << setw(5)<< companies.cpost << " "
         << left << setfill(' ') << setw(20)<< companies.ville << " "
         << left << setfill(' ') << setw(14)<< companies.tel << " "
         << left << setfill(' ') << setw(14)<< companies.fax << " "
         << left << setfill(' ') << setw(15)<< companies.email << " "
         << left << setfill(' ') << setw(16)<< companies.siret ;
         return  flux;
         }
     
    ostream & operator << (ostream & fluxFinancier, Balanceagee  const & balClient) // Affichage des donnees de la structure Balanceagee
         {
         fluxFinancier
         << left << setfill(' ') << setw(15)<< balClient.societe << " "
         << left << setfill(' ') << setw(10)<< balClient.compta << " "
         << left << setfill(' ') << setw(10)<< balClient.site << " "
         << left << setfill(' ') << setw(16)<< balClient.piece <<  " "
         << left << setfill(' ') << setw(16)<< balClient.commande << " "
         << left << setfill(' ') << setw(10)<< balClient.dateEcriture << " "
         << left << setfill(' ') << setw(10)<< balClient.dateEcheance << " "
         << right << setfill(' ') << setw(13)<< fixed << setprecision(2) << balClient.montant << " "
         << left << setfill(' ') << setw(10)<< balClient.commercial << " "
         << right << setfill(' ') << setw(13)<< fixed << setprecision(2) <<  balClient.soldeDue ;
         return  fluxFinancier;
         }
     
    void  traitementsDonneesClients()  /*Lecture du fichier csv et envoie des informations dans une structure */
         {
         string ligne; //Une variable pour stocker les lignes lues
        ifstream fichierAdresses ("Adresseclients.csv");
         if(fichierAdresses)
             {
             //L'ouverture s'est bien passée, on peut donc lire
             while(getline(fichierAdresses, ligne)) //Tant qu'on n'est pas à la fin, on lit
                 {
                 Company company;
                 istringstream iss(ligne);  // Transpytage du flux ligne pour stocker dans la stucture
                 iss  >> company;
                 companies.push_back(company);
                // Tri des adresses pas numero de site
                sort(companies.begin(), companies.end(), fonctionTriAdresseClient);
                rec_countA++; //compteur
                 }
             }
                // Tant qu’il y a des donnees dans le tableau on les affiche
         else
         {
         cout << "ERREUR: Impossible d'ouvrir le fichier des adresses clients." << endl;
         }
        fichierAdresses.close(); //On referme le fichier
         //On ne peut plus écrire dans le fichier à partir d'ici
     
     string lignef; //Une variable pour stocker les lignes lues
     ifstream fichierBalAgeeClient ("balanceagee.csv");
             if(fichierBalAgeeClient)
             {
             //L'ouverture s'est bien passée, on peut donc lire
             while(getline(fichierBalAgeeClient, lignef)) //Tant qu'on n'est pas à la fin, on lit
                 {
                 Balanceagee balanceAgeeClient;
                 istringstream iss(lignef); // Transpytage du flux lignef pour stocker dans la stucture
                 iss  >> balanceAgeeClient;
                 balClient.push_back(balanceAgeeClient);
     
                 //Tri des factures pas numero de site
                sort(balClient.begin(), balClient.end(),fonctionTriBalanceAgeeClient);
     
                rec_countB++; //compteur
                 }
             }
            // Tant qu’il y a des donnees dans le tableau on les affiche
             else
             {
             cout << "ERREUR: Impossible d'ouvrir le fichier de la Balance agee." << endl;
             }
         fichierBalAgeeClient.close(); //On referme le fichier
         //On ne peut plus écrire dans le fichier à partir d'ici
         }
     
     void afficherDonneesClient()
         {
        cout << "Veuillez preciser un numero de client" << endl;
        int nCompta;
         cin >> nCompta;
         for(int i = 0;i < rec_countA;i++)
             {
             if(companies[i].compta == nCompta)
                 {
                    cout << companies[i] << endl;
                 if(i == companies.size())
                     {
                     cout << "Il n'existe pas de fiche clients sous ce numero" << endl;
                     }
                 else
                     {
                         for(int j = 0;j < rec_countB;j++)
                         {
                         if(balClient[j].compta == nCompta)
                             {
                            cout << balClient[j] << endl;
                             }
                         if(j == balClient.size())
                             {
                             cout << "Il n'existe pas de donnee financiere pour ce client" << endl;
                             }
                         }
                     }
                 }
             }
         }
     
    bool operator==(const Balanceagee& ba1, const Balanceagee& ba2)
    {
    return ba1.compta == ba2.compta;
    return true;
    };
     
     
    int main()
         {
         traitementsDonneesClients();
         afficherDonneesClient();
     
         return 0;
         }

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Salut,

    sous Windows, pour les caractères spéciaux il vaut mieux utiliser std::wstring il me semble.
    Pour ton problème de date, convertis-les en format numérique classique type Unix time.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Invité
    Invité(e)
    Par défaut
    wstring ne passe pas dans l'operateur istream

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    http://www.cplusplus.com/reference/istream/wistream/
    Qu'elle est bien faîte cette STL tout de même.

    Sinon la conversion de char* en wchar_t* est toujours possible http://www.cplusplus.com/reference/locale/codecvt/ et a de nombreux exemples sur ce forum.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Je vous en remercie, mais ce message d'erreur apparait :

    error: no matching function for call to 'getline(std::wistream&, std::__cxx11::wstring&, char)'

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    Je ne disconviens pas de l'utilité de "std::wstring", mais, avant de faire un truc carré, il faut aussi savoir d'où l'on part.
    Et pour cela, il faut savoir avec quel encodage le fichier CSV a été créé, Windows-1252? UTF-8 sans BOM? UTF-8 avec BOM ? etc...
    APRES, on pourra faire la conversion entre cet encodage et les "std::wstring".

  7. #7
    Invité
    Invité(e)
    Par défaut
    C'est fichier Excel (office 10) converti en fichier csv avec séparateur ;

    Windows-1252 UTF-8 sans BOM

  8. #8
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    As-tu essayé avec un wchar_t, c'est-à-dire: std::getline(wfile, wline, L';')?
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  9. #9
    Invité
    Invité(e)
    Par défaut
    Non, je n'avais pas essayé. Une fois les modifications faites il m'affiche cette erreur des la premier ligne pour l'afficchage des données

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    wostream & operator << (wostream & flux, Company const & companies) // Affichage des donnees de la structure Company
         {
         flux
         << left << setfill(' ') << setw(15)<< companies.societe << " "
    Message d'erreur :
    error: no match for 'operator<<' (operand types are 'std::basic_ostream<wchar_t>::__ostream_type {aka std::basic_ostream<wchar_t>}' and 'std::_Setfill<char>')

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Encore un micro-effort de compréhension, de lecture du message d'erreur plutôt clair, on ne mélange pas char et wchar_t n'importe comment.
    Ternel donne la solution juste au-dessus, en préfixant les char par L qui indique un wchar_t.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Erreur corrigée.
    Le programme compile mais n'affiche toujours pas les caractères spéciaux.

  12. #12
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Et donc, qu'en déduis-tu?
    Nous sommes un forum d'entraide, pas un débugger en ligne…
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  13. #13
    Invité
    Invité(e)
    Par défaut
    Je suis d'accord sur le fait que ce n'est pas un serveur de debugger, certains arrive en demandant des réponses sans rien avoir apporter.
    j'ai écrit tout le programme sans demander que l'on me le fasse, je demande juste un coup de main car je n'arrive pas a finaliser ce programme et ne comprend pas là ou ca plante.
    Je ne suis pas programmeur, j'en suis conscient, je veux juste mettre en place un petit logiciel dans mon association.

    J'ai juste suivi des tutos en ligne.

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    Windows-1252 UTF-8 sans BOM
    C'est une oxymore, Windows-1252 ne peut être UTF-8.
    C'est l'un ou l'autre.
    Configurez votre input stream pour qu'il soit cohérent avec l'encodage du fichier.
    Par exemple avec un "#pragma setlocal(...)"
    https://blogs.msdn.microsoft.com/vcb...t-cc-compiler/
    Ou utilisez iconv ou équivalent pour avoir un type d'encodage plus "safe".
    https://en.wikipedia.org/wiki/Iconv

Discussions similaires

  1. [XL-2013] Modifier donnée dans fichier csv par macro mais laisser fichier en csv
    Par Carambar dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 05/11/2016, 17h20
  2. [CSV] Tri de données dans fichier CSV
    Par PhilippeIEP dans le forum Langage
    Réponses: 6
    Dernier message: 08/10/2008, 10h48
  3. Script extraction données dans fichier CSV
    Par nollier dans le forum VBScript
    Réponses: 18
    Dernier message: 20/06/2008, 09h32
  4. [DOM XML] Insertion données dans fichier XML avec PHP pour Flash ?
    Par ExSter dans le forum Bibliothèques et frameworks
    Réponses: 17
    Dernier message: 10/05/2006, 11h16
  5. Sauvegarde de données dans fichier csv
    Par issou dans le forum C
    Réponses: 1
    Dernier message: 22/12/2005, 08h36

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