Partage
  • Partager sur Facebook
  • Partager sur Twitter

import fichier.csv sur code::blocks (c++)

    14 septembre 2018 à 11:35:00

    #include <stdlib.h>
    #include <iostream>
    #include <fstream>
    #include <sstream>
    #include <vector>
    #include <cstdio>
    #include <string.h>
    using namespace std;
    
    // OBTAIN THE NUMBER OF LINES OF MY FILE.
     int matrix_lines(istream &iFile)
    {
        iFile.clear();
        iFile.seekg(0);
        int lines = 0;
        string line;
        while(!iFile.eof())
            {
            getline (iFile, line);
            lines++;
            }
        cout << "NUMBER OF LINES: " << lines-1 << endl;
        return lines-1;
    }
    // OBTAIN THE NUMBER OF COLS OF MY FILE.
    
    int matrix_cols(istream &iFile)
    {
        iFile.clear();
        iFile.seekg(0);
        string line;
        int cols =0;
        int count =0;
    
        getline (iFile, line);
        char ligne [202];
        strcpy (ligne, line.c_str());
    
        for (int i=0; i< strlen (ligne); i++)
            if (ligne [i] ==';')
            count++;
            cols=count+1;
        cout << "NUMBER OF COLS : " << cols << endl;
        return cols;
    }
    
    // READ MATRIX
    vector<vector<double> > matrix_read(istream &iFile, int lines, int cols)
    {
        vector< vector<double> > matrix(cols, std::vector<double>(lines));
        double value;
        iFile.clear();
        iFile.seekg(0);
        string line;
    
        for(int i = 0; i < lines; i++)
            {
            for(int j = 0; j < cols; j++)
            {
               matrix[i][j] = (iFile>>value,value);
               cout << matrix[i][j] << " ";
    
            }
            cout << "\n" << endl;
            }
            return matrix;
    }
    int main()
    { 
        int lines,cols;
        ifstream iFile;
    
        iFile.open("C:/Users/AH673B4N/Documents/_Developpement/Dymola/ThreePhaseCableABCDBuilder/Inputs/Measurements.csv");
    
        if(!iFile) { // FILE COULDN'T BE OPENED
            cerr << "Error: FILE COULD NOT BE OPENED" << endl;
            exit(1);
                   }
        cols = matrix_cols(iFile);
        lines = matrix_lines(iFile);
    
        matrix_read(iFile, lines, cols);
    
        iFile.close();
    
        return (EXIT_SUCCESS);
    }
    
    
    


    Bonjour tout le monde,

    J'ai un fichier.csv, qui contient des données, 202 lignes et 10 colonnes ( la première ligne représente les entêtes et les autres sont des valeurs de type double.

    J'aimerais récupérer ces données et les mettre dans une matrice afin de les utiliser dans mon projet.

    Mais en tournant mon code j'ai obtenu une matrice pleine de zéros et un message indiquant que mon exécutable a cessé de fonctionner !!

     voilà le code que j'ai réalisé, sincèrement je vois pas il est où le problème !! help plz

    NB: je suis débutante en programmation cpp

    Merci pour votre réponses :)

    • Partager sur Facebook
    • Partager sur Twitter
    Arbia
      14 septembre 2018 à 19:20:04

      Débutante en programmation : c'est précisément parce que vous êtes débutante que vos enseignants vous donnent des exercices à faire : pour apprendre. C'est à dire, essayer, faire des erreurs, les constater, chercher pourquoi, corriger et recommencer.

      Faites un test avec une petite matrice (2x2), ça permettra de regarder en détail ce qui se passe, au besoin en affichant une à une les informations trouvées. Sur 202 x 10, c'est pas raisonnable.

       A part ça, je ne suis pas sur que la lecture par  cin >> nombre   de valeurs séparées par des point-virgules, ça marche aussi bien que ça.

      EDIT: à propos : vérifiez l'indentation du code. Vous Serez Surprise Du Résultat (j'ai l'impression que vous avez fait du Python avant. Je dis ça, je dis rien).

      -
      Edité par michelbillaud 14 septembre 2018 à 23:17:21

      • Partager sur Facebook
      • Partager sur Twitter
        14 septembre 2018 à 23:40:29

        Pour compléter ce que dit michelbillaud, la technique qui marche à tous les coups est la technique des petits pas:

        • Etape 1: réussir à lire un double dans un fichier texte (indice: utiliser la fonction stod).
        • Etape 2: lire une ligne de x doubles séparés par un caractère convenu (au hasard le caractère ',') dans un fichier texte (indice possible, std::getline pour lire la ligne, les fonctions membres substr et find_first de std::string pour la découper et le type std::vector<double> pour stocker le résultat).
        • Etape 3: lire n lignes d'un nombre quelconque de doubles dans un fichier texte séparés par un caractère convenu. (Indice std::vector<std::vector<double>> pour le résultat).
        • Etape 4: vérifier que le truc lu à l'étape 3 correspond bien à une matrice(pas d'indice, ce serait trop facile). 
        • Etape 5: transformer le truc lu en une matrice utilisable et efficace. Indice linéariser le vector obtenu à l'étape 3 pour avoir des performances tip top ^^ Là, c'est des maths, un tableau 2D peut être représenté sous la forme d'un tableau 1D dans lequel on mettrait toutes les lignes les unes à la suite des autres. Les machines sont très efficaces sur ce genre de configuration. L'indice (x,y) est obtenu en utilisant la transformation p = x * nombre de colonnes + y (ou p est la position dans le tableau de stockage), la démonstration mathématique est évidente, je te la laisse en exercice. 
        Quand je sais faire l'étape 1, je passe à l'étape 2 en utilisant ce que j'ai appris à l'étape 1. Quand je sais faire l'étape 2, je passe à l'étape 3 en utilisant ce que j'ai appris aux étapes 1 et 2 et ainsi de suite... La solution du problème final, je ne la connais jamais, par contre je sais en résoudre des petits bouts par ci par là, donc je résous séparément ces petits bouts, et j'apprends à résoudre les bouts qui manquent. A l'arrivée, j'ai un puzzle, qu'il me reste à assembler correctement pour arriver au résultat. Cette technique porte un nom, c'est le principe de responsabilité unique (SRP dans la littérature), c'est un principe fondamental en programmation, je divise ma tâche compliquée (lire une matrice 202x10 c'est très compliqué) en tâches plus simples (lire un double c'est simple), lire une ligne de 10 doubles séparés par des virgules, c'est un peu plus compliqué que lire un double, mais si on a une bonne technique pour en lire un, c'est pas très compliqué d'en imaginer une pour en lire 10 ou même 100 ou même un nombre quelconque. Enfin, si je sais lire une ligne contenant un nombre quelconque de doubles, lire un nombre quelconque de lignes contenant un nombre quelconque de double n'est pas vraiment dur, parce que je vais m'appuyer sur ce que je sais déjà faire. Vérifier que ce que j'ai lu correspond bien à une matrice de double, n'est pas vraiment compliqué, il suffit de vérifier que le nombre de colonnes est le même pour toutes les lignes que j'ai lu, si cette propriété est vérifiée, alors j'ai une matrice ;)

        Edit: l'étape 2 est encore trop compliquée, il faut la subdiviser. Sachant que deux doubles seront séparés par une virgule comment je repère une virgule? Je commence avec 2 double, puis je généralise comment je découpe une chaîne de caractère en coupant chaque fois que je tombe sur une virgule. A partir du moment où je sais faire ça, je sais découper une ligne de mon fichier en une liste de double, je sais lire une ligne de mon fichier, je peux passer à l'étape suivante.

        -
        Edité par int21h 15 septembre 2018 à 0:32:44

        • Partager sur Facebook
        • Partager sur Twitter
        Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
          15 septembre 2018 à 7:39:34

          Voilà. La tendance du débutant est de vouloir avoir fini avant de commencer. À témoin l'idée de tester  sur un fichier de 200 x 10.

          Alors il écrit un programme qui combine plein de trucs qu' il ne maîtrise pas (ce qui est évidemment normal),  ca ne marche pas (vous vous en doutiez), etc il passe des heures à tripoter des trucs dans son code qui ne marche pas en espérant que par hasard, il va toucher un truc et que ca va se mettre à marcher, comme ca, parce que je le vaux bien.

          C'est se mettre soi-même  dans une situation particulierement désagréable : passer des heures sur un truc qu'on ne comprend pas et qui ne marche pas. Désespérant.

          D'ou l'approche par petits pas, ou objectifs partiels.

          On se donne un objectif très réduit, qui semble intervenir dans la réalisation de l' objectif final. Un truc faisable en quelques minutes.

          Par exemple :  écrire une fonction qui prend en parametre une ligne (srring)  et retourne le vecteur de valeurs qui s'y trouve. Pas besoin d'y meler la lecture de fichier.

          Ensuite, regarder comment on lit un fichier ligne par ligne.

          Puis comment, en lisant dans un fichier, on construit la matrice  (vecteur des vecteurs des val9eurs)

          En faisant comme ca, on teste par petits bouts, on n'a que des bugs simples liés aux dernières choses qu'on vient d'écrire. 

          Et on a des SUCCÈS sur des objectifs partiels  un rythme beaucoup plus élevé,  ce qui est excellent pour le moral et encourage à faire un petit pas de plus.   Entretien de la motivation.

          -
          Edité par michelbillaud 15 septembre 2018 à 8:12:58

          • Partager sur Facebook
          • Partager sur Twitter
            17 septembre 2018 à 9:11:34

            Bonjour,

            Je vous remercie pour vos réponses et j'avoue que vous avez raison en tant que débutante j'aurais du commencer par des trucs simples (techniques des petits pas ;) ).

            @michelbillaud j'ai jamais fait du Python :p je suis électricienne de base du coup j'ai pas eu l'opportunité de le faire mais peut être un jour je vais l'utiliser on sait jamais :)

            Arbia :)

            • Partager sur Facebook
            • Partager sur Twitter
            Arbia
              17 septembre 2018 à 10:48:53

              C'est pas spécifiquement un truc pour les débutants, les petits pas.

              C'est au contraire à ça qu'on reconnait les bons programmeurs : ils ne croient plus depuis longtemps qu'on écrit 500 lignes et que ça va marcher dès qu'on aura corrigé les point virgules et les parenthèses. Ils savent que ce qu'ils font est suffisamment compliqué pour leur causer des tas d'ennuis, rapport aux capacités assez limitées du cerveau en matière de mémoire et d'attention, et s'organisent en conséquence en décomposant.

              Le débutant, il essaie souvent de passer en force.

              -
              Edité par michelbillaud 17 septembre 2018 à 10:49:48

              • Partager sur Facebook
              • Partager sur Twitter
                18 septembre 2018 à 10:25:44

                 #include <stdlib.h>
                #include <iostream>
                #include <fstream>
                #include <sstream>
                #include <vector>
                #include <cstdio>
                #include <string.h>
                #include <cstdlib>
                
                
                using namespace std;
                
                int main()
                {
                   ifstream fichier ("C:/Users/AH673B4N/Documents/_Developpement/Dymola/ThreePhaseCableABCDBuilder/Inputs/mesuree.csv");
                    if (fichier)
                    {
                            string ligne;
                            while(getline(fichier,ligne))
                            {
                            cout << ligne <<endl;
                            int posPoint1 = ligne.find(';');
                            string ligne2;
                            string ligne3;
                            ligne2 =ligne.substr(0,posPoint1);
                            ligne3 =ligne.substr(posPoint1+1);
                            cout << ligne2<< endl;
                            cout << ligne3<< endl;
                            }
                  
                
                        {
                           
                {
                  return EXIT_SUCCESS;
                }
                        }
                    }
                    else
                    {
                        cout << " erreur" << endl;
                    }
                    return 0;
                }
                
                 
                #include <stdlib.h> #include <iostream> #include <fstream> #include <sstream> #include <vector> #include <cstdio> #include <string.h> #include <cstdlib> using namespace std; int main() { ifstream fichier ("C:/Users/AH673B4N/Documents/_Developpement/Dymola/ThreePhaseCableABCDBuilder/Inputs/mesuree.csv"); if (fichier) { { string ligne; vector <string> resultat; vector <string>::iterator it; while (getline(fichier,ligne,';')) resultat.push_back(ligne); // Print the result: for ( it = resultat.begin(); it != resultat.end(); ++it) std::cout << *it << std::endl; { return EXIT_SUCCESS; } } } else { cout << " erreur" << endl; } return 0; }


                Bonjour,

                j'ai essayé deux méthodes:

                La première en utilisant getline(), find (), substr() mais le problème que j'ai pas compris comment stocker le résultat dans un vecteur!!

                et la deuxième en utilisant un iterator, mais j'ai obtenu un vecteur colonne et normalement je dois trouver un vecteur ligne

                je pense que je suis pas sur la bonne route :/

                -
                Edité par ArbiaHaded 18 septembre 2018 à 10:45:14

                • Partager sur Facebook
                • Partager sur Twitter
                Arbia
                  18 septembre 2018 à 12:04:07

                  Stocker le résultat dans un vecteur, c'est facile, tu utilises la fonction push_back().

                  std::vector<int> makeVector(int value,size_t count)
                  {
                     std::vector<int> result;
                     for(auto  i = 0u; i < count ; ++i){
                        result.push_back(value);
                     }
                     return result;
                  }

                  Pour faire une matrice, on fait pareil, sauf qu'on push carrément un vector ;)

                  std::vector<std::vector<int>> makeMatrix(size_t l,size_t c,int value)
                  {
                      std::vector<std::vector<int>> result;
                      for(auto i = 0u; i < l ; ++i){
                         result.push_back(makeVector(value,c));
                      }
                      return result;
                  }

                  C'est pas super efficace, mais c'est simple et ça marche ;)


                  -
                  Edité par int21h 18 septembre 2018 à 12:04:46

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
                    18 septembre 2018 à 12:44:02

                    Faut lutter pour s'enlever de la tête l'idée de faire 3 choses à la fois (lire dans un fichier, decouper une ligne, en récupérer les valeurs etc).

                    Voila déjà une étape : une ligne est formée de champs séparés par des points-virgules :   on donne une chaine et un délimiteur, et on récupère un vecteur contenant les différents champs.

                    Test :

                    auto r = decoupe("12;45.6;7.89", ';');
                    
                    for (auto &c : r) {
                        std::cout << c << std::endl;
                    }

                    qui devrait afficher

                    12
                    45.6
                    7.89
                    

                    Un exemple de code pour faire ça :

                    std::vector<std::string> decoupe(const std::string &chaine, 
                                                     const char delimiteur)
                    {
                      std::vector<std::string> champs;
                      champs.push_back("");
                      
                      for (char c : chaine)
                      {
                        if (c == delimiteur) {
                          champs.push_back("");
                        } else {
                          champs.back() += c;
                        }
                      }
                      return champs;
                    }
                    


                    Après, faire une fonction qui prend un vecteur de chaines pour en faire un vecteur de nombres, etc.

                    -
                    Edité par michelbillaud 18 septembre 2018 à 12:44:42

                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 septembre 2018 à 13:43:06

                      je vous remercie pour les réponses

                      mais une question débile c'est quoi "auto" !! un type comme tableau, liste ... ?

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Arbia
                        18 septembre 2018 à 14:02:30

                        https://en.cppreference.com/w/cpp/language/auto
                        En gros, on dit au compilateur de se démerder pour trouver le bon type.
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                          18 septembre 2018 à 15:40:09

                          bacelar a écrit:

                          https://en.cppreference.com/w/cpp/language/auto
                          En gros, on dit au compilateur de se démerder pour trouver le bon type.


                          Plus précisément, parce que le compilateur ne fait pas de magie :

                          • Dans une déclaration   comme auto x = une_expression;   il donne à x le type de la valeur de l'expression.
                          • dans un   for(auto x : y){ ...},  il donne à x le type des éléments de la séquence y

                          Sa déduction est faite à partir de ces seuls éléments.  Si c'est pas compatible avec la suite, tant pis. Par exemple

                          auto x = 3;
                          x = 3.14;
                          

                          x est un int, parce que ça va bien avec la première ligne.



                          -
                          Edité par michelbillaud 18 septembre 2018 à 15:42:32

                          • Partager sur Facebook
                          • Partager sur Twitter
                            19 septembre 2018 à 12:11:16

                            Bonjour

                            @michelbillaud, lorsque j'ai essayé ton code, j'avais l'erreur suivante: decoupe was not declared in this scope ??

                            • Partager sur Facebook
                            • Partager sur Twitter
                            Arbia
                              19 septembre 2018 à 14:09:23

                              Et c'est qui ce "decoupe" ? dans le code de @michelbillaud ?
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                                19 septembre 2018 à 14:32:53

                                C'est bête, il suffit pas de copier-coller, faut aussi comprendre, et compléter.

                                -
                                Edité par michelbillaud 19 septembre 2018 à 14:33:28

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  20 septembre 2018 à 13:39:12

                                  #include <iostream>
                                  #include <stdlib.h>
                                  #include <iostream>
                                  #include <fstream>
                                  #include <sstream>
                                  #include <vector>
                                  #include <cstdio>
                                  #include <string.h>
                                  #include <cstdlib>
                                  
                                  using namespace std;
                                  
                                  
                                  int main()
                                  {
                                     ifstream file("C:/Users/AH673B4N/Documents/_Developpement/Dymola/ThreePhaseCableABCDBuilder/Inputs/mesure1.csv");
                                     string line;
                                     vector<double> vec;
                                     while (getline(file, line))
                                  {
                                         cout << line << endl;
                                         istringstream ss(line);
                                         string word;
                                         while (getline(ss, word,';')){
                                         double value = strtod(word.c_str(), NULL); // cnversion string to double
                                         vec.push_back(value); //remplissage du vecteur
                                    }
                                  }
                                  //Affichage du vecteur
                                  for (int i = 0; i < vec.size(); i++){
                                          cout << vec[i] << '\n';
                                   }
                                   //cout << vec[0] << " " << vec [1] ;
                                      return 0;
                                  }
                                  
                                  


                                  Bonjour

                                  @michelbillaud stp c'est pas bête :( :( :(

                                  Any way, J'ai essayé de suivre vos conseils, et j'ai réussi à écrire un code fonctionnel qui permet de lire un fichier d'une seule ligne qui contient deux valeurs doubles et les stocker dans un vecteur.

                                  Voilà le code:

                                  dans l'attente de vos remarques

                                  merci et bonne journée

                                  -
                                  Edité par ArbiaHaded 20 septembre 2018 à 14:45:46

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Arbia
                                    24 septembre 2018 à 16:26:14

                                    #include <string>
                                    #include <sstream>
                                    #include <iostream>
                                    #include <vector>
                                    #include <fstream>
                                    
                                    int main()
                                    {
                                        using namespace std;
                                    
                                        
                                        const string filename = "C:/Users/Measurements.csv";
                                        ifstream in(filename); // open the file
                                        string line, field;
                                        vector< vector<string> > array;  // the 2D array
                                        vector<string> v;                // array of values for one line only
                                    
                                        if (!in) // error if the file doesn't exist
                                      {
                                        cerr << "Can't open file " << filename << endl;
                                        return 1;
                                      }
                                    
                                        while ( getline(in,line) )    // get next line in file
                                        {
                                            v.clear();
                                            stringstream ss(line);
                                    
                                            while (getline(ss,field,';'))  // break line into comma delimitted fields
                                            {
                                                v.push_back(field);  // add each field to the 1D array
                                            }
                                    
                                            array.push_back(v);  // add the 1D array to the 2D array
                                        }
                                    
                                        // print out what was read in
                                    
                                        for (size_t i=0; i<array.size(); ++i)
                                        {
                                            for (size_t j=0; j<array[i].size(); ++j)
                                            {
                                                cout << array[i][j] << " | "; // (separate fields by |)
                                            }
                                            cout << "\n";
                                        }
                                    
                                        return 0;
                                    }
                                    


                                    Bonjour

                                    voilà en fin j'ai réussi à avoir un code fonctionnel :)

                                    Je vous remercie pour vos conseils :)

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Arbia

                                    import fichier.csv sur code::blocks (c++)

                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                    • Editeur
                                    • Markdown