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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    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 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    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 confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 489
    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".

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