Bonjour,
J'ai besoin d'aide!!!:help:
Je voudrais remplir ma combobox qui se trouve dans une boite de dialog à partir d'un fichier .csv. Es ce que quelqu'un a une idée???
Version imprimable
Bonjour,
J'ai besoin d'aide!!!:help:
Je voudrais remplir ma combobox qui se trouve dans une boite de dialog à partir d'un fichier .csv. Es ce que quelqu'un a une idée???
C'est quoi ton problème ouvrir le fichier et lire les mots clé ou bien ajouter les item dans ta combobox ?
Mon problème est que je veux ajouter des items dans ma combobox à partir de ce fichier et ensuite en fonction de l'item choisi alors on affiche les information qui là concerne.
salut,
dans ton OnInitDialog de ta boite de dialogue :
c'est un exemple, à adapter ...Code:
1
2
3
4
5
6
7
8
9
10 CComboBox *pComboBox=(CComboBox*)GetDlgItem(IDC_COMBOBOX); { CStdioFile file(_T("C:\\fichier.txt"),CFile::modeRead|CFile::typeText); CString string; while (file.ReadString(string)) VERIFY(pComboBox->AddString(string)>=0); }
@+
Merci pour ta solution.
Mais ça ne fonctionne pas!!!
Je n'ai rien qui s'affiche dans ma Combobox!!!!
Code:
1
2
3
4
5
6
7
8
9 CComboBox *pComboBox=(CComboBox*)GetDlgItem(IDC_COMBOCHOIXDUSITE); { CStdioFile file(_T("D:\\Alexis\\stage indic alexis\\CODE\\Debug\\Copie de ENCOU_CCH_LVL_pipe.csv"),CFile::modeRead|CFile::typeText); CString string; while (file.ReadString(string)) VERIFY(pComboBox->AddString(string)>=0); }
tu as une assertion en mode debug ? sur la ligne VERIFY(...) ?
attention le fichier csv, représente normalement une matrice avec des colonnes (séparées par des tabulations) et des lignes (séparées par un retour chariot)
dans l'exemple, je ne traite que les lignes. si tu as plusieurs colonnes il faut adapter
as tu bien mis le code dans OnInitDialog() ?
pour faire un essai, remplace la ligne VERIFY(...) par
@+Code:
1
2 AfxMessageBox(string);
Ok en mettantj'ai bien vu mon fichier!Citation:
AfxMessageBox(string);
En effet, je voudrais afficher une colonne de mon fichier .csv dans ma ComboBox.
Le fichier .csv fonctionne comme ceci : exemple :
Ceci représente un tableau .xls
Requête Référence Propriétaire Date Arrivée Matériel
57101 C7587J Nantes 20/01/2007
57102 123456 Paris 18/12/2006
Fichier au format .xls
Fichier au format .csvCitation:
Requête;Référence;Ilot technicien;Date Arrivée Matériel
57101;C7587J;ILOT TACTIQUE;20/01/2007
57102;123456;ILOT RESEAU;18/12/2006
Dans mon programme j'ai remplacer les ; par des |.
Comment par exemple mettre que la colonne Proriétaire dans ma ComBoBox?
Et en sélectionnant cette colonne j'aurais d'afficher les propriétaires.
tu peux regarder su coté de sscanf
http://www.cplusplus.com/reference/c...cstdio/sscanf/
tu recherches la partie qui t'intéresse en comptant les délimiteurs
exemple :
@+Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 CString string(_T("col1;col2;col3;col4")); // 4 colonnes const int col=2; // pour extraire la colonne 3 (index 2) par exemple int n=col,i=0; while (n>0) { i=string.Find(_T(';'),i); if (i<0) AfxThrowUserException(); // colonne absente ++i; --n; } int j=string.Find(_T(';'),i); if (j<0) j=string.GetLength(); CString value(string.Mid(i,j-i)); // ici value contient la valeur de la colonne
Tu peux aussi utiliser ma methode Tokenize de la classe CString. Doc ici.
Slt j'ai tester ton code mais ça ne fonctionne pas.
Ya t'il des erreurs dans ce que j'ai programmer?Code:
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 //TEST POUR LA COMBOBOX CHOIX DU SITE CComboBox *pComboBox=(CComboBox*)GetDlgItem(IDC_COMBOCHOIXDUSITE); { CStdioFile file(_T("D:\\Alexis\\stage indic alexis\\CODE\\Debug\\Copie de ENCOU_CCH_LVL_pipe.csv"),CFile::modeRead|CFile::typeText); CString string(_T("col1|col2|col3|col4")); // colonnes const int col=3; // pour extraire la colonne 4 (index 2) par exemple int w=col,x=0; while (w>0) { x=string.Find(_T('|'),x); if (x<0) AfxThrowUserException(); // colonne absente ++x; --w; } int j=string.Find(_T('|'),x); if (j<0) j=string.GetLength(); CString value(string.Mid(x,j-x)); // ici value contient la valeur de la colonne }
J'ai 78 colonnes ya-t-il un raccourci pour mettre ces colonnes dans :
J'ai remplacer les point virgules par des pipes pour les séparateurs.Code:CString string(_T("col1|col2|col3|col4")); // colonnes
qu'est ce qui ne fonctionne pas ?!?!
il faut associer maintenant le chargement du CSV et l'extraction de colonne ...
comprends-tu ce que tu écris en code ?
le premier code que j'ai donné, extrait uniquement une ligne du fichier CSV
le deuxieme code, extrait une colonne à partir d'une ligne
maintenant, il faut mixer les deux codes ...
@+
Ce qui ne fonctionne pas c'est qu'il n'y a rien qui s'affiche dans ma combobox.
Ok pour le premier code il extrait bien une ligne du fichier csv.
Je ne suis pas sur de tous comprendre dans le code je te le met avec les commentaires comme ça tu pourra me dire si je me trompe.
Dans mon appli je voudrais lire toutes les lignes d'une colonne de mon fichier .csv pour ensuite mettre les lignes dans ma combobox sans répéter la ligne, sans avoir plusieurs fois le même choix dans ma combobox.Code:
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 //TEST POUR LA COMBOBOX CHOIX DU SITE CComboBox *pComboBox=(CComboBox*)GetDlgItem(IDC_COMBOCHOIXDUSITE); { CStdioFile file(_T("D:\\Alexis\\stage indic alexis\\CODE\\Debug\\Copie de ENCOU_CCH_LVL_pipe.csv"),CFile::modeRead|CFile::typeText); CString string(_T("col1|col2|col3|col4")); // Cela veut dire qu'il y a 4 colonnes dans mon fichier .csv const int col=2; // pour extraire la colonne 3 (index 2) par exemple int w=col,x=0; // déclarations des variables que l'on va utilisé ensuite while (w>0) // tant que la colonne choisi (ici 2) est supérieur à 0 faire { x=string.Find(_T('|'),x); // on regarde s'il y a des séparateurs et ont les mêmes dans x. if (x<0) // s'il n'y a pas de "|" AfxThrowUserException(); // colonne absente ++x; //on incrémente x --w; //on décrémente la colonne } int j=string.Find(_T('|'),x); // on déclare j comme étant la variable de pipe trouvé if (j<0) // si il n'y a pas de pipe faire j=string.GetLength(); // j= le nombre d'octets dans la chaîne CString value(string.Mid(x,j-x)); // ici value contient la valeur de la colonne }
non, c'est un exemple. La variable string doit être une ligne du fichier CSVCitation:
Code:
1
2 CString string(_T("col1|col2|col3|col4")); // Cela veut dire qu'il y a 4 colonnes dans mon fichier .csv
bon j'ai fais plus simple (en tenant compte de la remarque de superjaja, le code est beaucoup plus court, mais moins rapide à l'éxecution)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 CComboBox *pComboBox=(CComboBox*)GetDlgItem(IDC_COMBOCHOIXDUSITE); { CStdioFile file(_T("D:\\Alexis\\stage indic alexis\\CODE\\Debug\\Copie de ENCOU_CCH_LVL_pipe.csv"),CFile::modeRead|CFile::typeText); CString string; while (file.ReadString(string)) { int i=0; for (int n=2;n>0;--n) // on évite les 2 premières colonnes string.Tokenize(_T("|"),i); VERIFY(pComboBox->AddString(string.Tokenize(_T("|"),i))>=0); } }
c'est un code prêt à l'emploi
@+
erreur lors de la compilation, Tokenize n'est pas un membre de CString!!!
Problème car je n'ai que des colonnes je n'ai pas de ligne!!!! alors comment faire pour lire tte les lignes d'une colonne sans les répéter dans la combobox?
tu es sous VC6 alors ?!Citation:
erreur lors de la compilation, Tokenize n'est pas un membre de CString!!!
je ne comprends plus rien .... :aie:Citation:
Problème car je n'ai que des colonnes je n'ai pas de ligne!!!! alors comment faire pour lire tte les lignes d'une colonne sans les répéter dans la combobox?
Oui je suis sur VC6!
je réexplique :
je me trouve avec un fichier .csv.
Dans ce fichier j'ai :
Requête Référence Proprietaire Date Arrivée Matériel
57101 __C7587J __PARIS_____ 20/01/2009
57102 __123456 __NANTES___ 18/12/2008
57103 __789456 __PARIS_____ 14/06/2008
57104 __654528 __PARIS_____ 15/05/2008
57105 __321654 __NANTES___ 21/02/2009
J'ai installé sur une boîte de dialog une ComboBox. J'aimerais dans celle si affiché les Propriétaires, soit, PARIS et NANTES.
Comment faire?
et c'est quoi le délimiteur de colonne dans ce fichier CSV ?
c'est une position précise pour chaque colonnes ou un caractère précis ?
le point virgule ";"Citation:
et c'est quoi le délimiteur de colonne dans ce fichier CSV ?
Je crois surtout qu'il espère que tu vas réfléchir à sa place sur des questions qui n'ont rien de techniques ... :kill:
mais quand je vois ça, je ne vois pas de point virgule !Citation:
Requête Référence Proprietaire Date Arrivée Matériel
57101 __C7587J __PARIS_____ 20/01/2009
57102 __123456 __NANTES___ 18/12/2008
57103 __789456 __PARIS_____ 14/06/2008
57104 __654528 __PARIS_____ 15/05/2008
57105 __321654 __NANTES___ 21/02/2009
je crois bien aussi ...... :aie:Citation:
Je crois surtout qu'il espère que tu vas réfléchir à sa place sur des questions qui n'ont rien de techniques ...
Bonjour,
Ceci représente l'exemple d'un tableau!!!!Citation:
Requête Référence Proprietaire Date Arrivée Matériel
57101 __C7587J __PARIS_____ 20/01/2009
57102 __123456 __NANTES___ 18/12/2008
57103 __789456 __PARIS_____ 14/06/2008
57104 __654528 __PARIS_____ 15/05/2008
57105 __321654 __NANTES___ 21/02/2009
Et oui ce sont des points virgules ";" les séparateurs dans un fichier .csv mais moi j'ai remplacer c'est point virgule par des pipes "|"!!
je voulais juste avoir de l'aide, sur comment filtrer une colonne!!!
merci pour votre aide:kill:
Réalisation du code pour afficher dans la combobox :
Code:
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 // PERMET D'AFFICHER LES SITES DANS LA COMBOBOX SANS AVOIR DEUX FOIS LE MEME... int w,x; int res2; w=1; m_valueCtrlSite.InsertString(0,(CString)listesite[0]); // on insert dans la ComboBox le nom du premier site for (int j=0;j<60000;j++) // pour 60000 lignes... { x=j; // "x" prend la valeur de "j" (c'est a dire le numero de la ligne) do //faire { if (j!=0) // si j est différent de 0 (car sinon listesite[j-1] n'existe pas -> bug) { res2 = strcmp (listesite[x-1],listesite[j]); // on compare le nom du site au précédent if (res2!=0) // si les 2 noms sont différent { x--; // on décrémente "x" de facon à comparer avec le nom du site "l-2" puis "l-3"... if (x==0) // ...jusqu'à temps que "x" soit égale à zéro (c-à-d jusqu'à ce qu'on est remonté tout le tableau) { m_valueCtrlSite.InsertString(w,(CString)listesite[j]); // s'il n'y était pas encore, on ajoute le nom du site dans la liste de la ComboBox w++; // on incrémente "w" qui correspond à la place du nom de site dans la liste de la ComboBox } } else // sinon, si les 2 chaines sont identiques (nom du site déja rencontré) { x=0; // on met "x" à zéro de facon à sortir de la boucle } } else { x=0; // on met "x" à zéro de facon à sortir de la boucle } } while (x!=0); //tant que "x" est différent de zéro } m_valueCtrlSite.SetCurSel(0); // Met la premiere valeur de la liste en choix par défaut m_valueCtrlSite.DeleteString(w-1); //Supprime le dernier choix de la liste (c'était un "vide"...)
Code:
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 //PERMET DE METTRE TOUS LES NOMS DES SITES PRESENT DANS LE FICHIER .CSV DANS UN TABLEAU "listesite" void CChoixIlot::ListeSite() { FILE * fichierCsv; // Nom du fichier qu'on va utiliser char * cToken; // Buffer du contenu des valeurs d'une ligne char * cToken2; // Buffer du contenu des valeurs d'une ligne char cBuffligne[1500] = ""; // Buffer du contenu de la ligne du fichier int iCompteur = 0; // Compte le nombre de fois où on boucle int colonneProprietaire; bool d=TRUE; // Numéros des colonnes qui nous intéressent // ON RECUPERE LE NUMERO DES COLONNES QUI NOUS INTERESSENT if(( fichierCsv = fopen (cheminFichier1,"r")) != NULL) //Si pas de problème lors de l'ouverture du fichier { //if (fgets(cBuffligne,sizeof(cBuffligne),fichierCsv) != NULL) while ( (fgets(cBuffligne,sizeof(cBuffligne),fichierCsv) != NULL) && d==TRUE )//pour toute les lignes du fichier ou jusqu'a ce que "d" soit faux { cToken = strtok( cBuffligne, "|\n" ); //Le délimiteur des valeurs est un pipe while( cToken != NULL && d==TRUE ) { iCompteur ++; // lorsqu'on boucle, cela veut dire qu'on passe à la colonne suivante... if((CString) cToken == "Propriétaire") { // si entre deux virgules on reconnait ce String colonneProprietaire = iCompteur;// alors on recupère ce qui correspond à son numéro de colonne cToken=NULL; } if ((CString) cToken == "Date Effective")// si on rencontre la dernière colonne "Date Effective" { d=FALSE; // on met "d" a FALSE pour sortir de la boucle } cToken = strtok( NULL, "|\n" ); //on passe au Token suivant }iCompteur=0; } }fclose(fichierCsv); if(( fichierCsv = fopen (cheminFichier1,"r")) != NULL) { CString temp; int l=0; //Si pas de problème lors de l'ouverture du fichier while (fgets(cBuffligne,sizeof(cBuffligne),fichierCsv) != NULL) //Pour chaque ligne du fichier { iCompteur=0; cToken2 = strtok( cBuffligne, "|" ); //Le délimiteur des valeurs est un pipe while ( cToken2 != NULL ) { iCompteur ++; // compteur des "pipe", à chaque boucle on est passé à la colonne suivante if ( iCompteur == colonneProprietaire ) // si on est à la colonne "Propriétaire" { int result=strcmp(cToken2," "); // on compare la valeur de la cellule a "vide" if(result!=0) //si la colonne "propriétaire" a bien été rempli { if ((CString)cToken2!="Propriétaire") // si la chaine de caractère n'est pas le titre de la colonne { temp=(CString)cToken2; // "temp" prend pour valeur le nom du site int c = temp.GetLength();// "c" prend pour valeur sa longueur temp.Delete(4,c-4); // on supprime tout le nom du site à partir du 4ème caractère int res1=strcmp(temp,"PROPRIETAIRE"); // pour pouvoir le comparer a la chaine "PROPRIETAIRE" if (res1!=0) { listesite[l]=cToken2; // on ajoute le nom du site au tableau "listesite" l++;//on incrémente le pointeur qui indique la ligne du tableau } } } } cToken2 = strtok( NULL, "|" ); // on récupère l'autre Token } } } fclose (fichierCsv); // on ferme le fichier }
:yaisse2: