#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
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
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.
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
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 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
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
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;
}
#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
#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
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.