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

Langage C++ Discussion :

Problème de traitement d'un fichier CSV


Sujet :

Langage C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 13
    Points : 9
    Points
    9
    Par défaut Problème de traitement d'un fichier CSV
    Bonjours tout le monde
    J'ai besoin d'un petit coup de main sur un problème que je n'arrive pas à résoudre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    char **szParams = NULL;		
     
    CString FID_Trie [1000];
    CString szCLine = "";					
    CString szpStrL = "";
     
    list<CString> pStrL;
    list<CString>::iterator iStrL;

    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
     
    //Ouverture du fichier CSV 
    fileConf = fopen(::szFileName5,"r");
    	if (fileConf != NULL)
    	{
    		while (! feof(fileConf))
    		{
    			 fgets(szLine,cst_iMaxLineSize,fileConf);
    			 szCLine = szLine;
     
    			 if(i != 0)
    			 {
                              szParams = split(szLine,';');
    			  szType = atoi(szParams[2]);
                              if(strlen(szCLine)>1)
    			  {
    			   if (strcmp(szParams[2],szType1) == 0)
    			   {
                         //Ajout dans la pile le contenu de la colonne 2 du fichier CSV
    			    pStrL.push_back(szParams[1]); 
                         //Ajout dans le tableau de la ligne entière non splité
    			    FID_Trie[j] = szCLine; 
     			    j++;
    			   }
    			  }
     
    			 }
    			 i++;
    		}
    		fclose(fileConf); 
    	}
    //Tri la pile
    pStrL.sort();
     
    while (!pStrL.empty())
      {
        szpStrL = pStrL.front();
     
        for(i=0;i<j;i++)
    	{
             //Ligne qui pose problème
    	 szParams = split((char*)LPCTSTR(FID_Trie[i]),';');
    	 itoa(i,vue,10);
             vue[1] = '\0';
         LogMessage("%s,%s,%s,%s%s"(CString)vue,szParams[0],szParams[1],szParams[2],szParams[3],szParams[4]);
    	}
    	pStrL.pop_front();		 
    }
    Enfin ma fonction split :
    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
     
    char** split(char* str, const char c)
    {
    	static char* tmp[2048];	//max 2048 colonnes
    	int current = 0;
    	tmp[current++] = str;
    	while (*str)
    	{
    		if(*str == c)
    		{
    			*str = '\0';
    			tmp[current++] = str+1;
    		}
    		++str;
    	}
    	tmp[current]=0;
    	return tmp;
    }
    Fichier CSV :
    1;1AS100;ACCES SURETE;CLA001.AS.ACC.001.
    2;1AS101;ACCES SURETE;CLA001.AS.ACC.002.
    3;1AS103;ACCES SURETE;CLA001.AS.ACC.003.
    4;1CC100;IST SURETE;SRV001.CC.AAA.004.
    5;1AS104;ACCES SURETE;CLA001.AS.ACC.005.
    6;1AS102;ACCES SURETE;CLA001.AS.ACC.006.


    Je vous donne les logs :


    Mon problème est le suivant :
    Lorsque je suis dans 'for(i=0;i<j;i++)' , ma fonction split modifie le contenu de FID_Trie alors que je ne le souhaite pas szParams = split((char*)LPCTSTR(FID_Trie[i]),';');
    Pour le second élément dans ma pile, le tableau est alors null. Je n'y comprends plus rien ....

    La finalité est de trier par ordre alphabétique le contenu de mon fichier CSV.

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Une réponse complètement à côté mais qui pourrait simplifier grandement ton problème : pourquoi ne pas utiliser la STL (std::ifstream, std::istringstream, std::string etc.) pour correctement lire ton fichier et générer ton vecteur. Cf ce poste.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Merci pour ta réponse complètement à côté
    Je vais tester le ifstream et compagnie pour la lecture de mon fichier CSV. Après on verra bien

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Au passage:
    Ta fonction split() me rappelle strtok(), mais en pire.
    Tu ne devrais même pas avoir besoin du buffer statique, seulement d'un pointeur statique sur le contenu de la chaîne (et encore, si tu suis l'interface de strtok_r(), le pointeur en question 'naura même pas besoin d'être statique.

    Et aussi, ton cast est absolument hideux. Si tu veux un pointeur non-const sur le contenu d'une CString, utilise sa fonction membre GetBuffer(taille).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Au passage:
    Ta fonction split() me rappelle strtok(), mais en pire.
    Tu ne devrais même pas avoir besoin du buffer statique, seulement d'un pointeur statique sur le contenu de la chaîne (et encore, si tu suis l'interface de strtok_r(), le pointeur en question 'naura même pas besoin d'être statique.

    Et aussi, ton cast est absolument hideux. Si tu veux un pointeur non-const sur le contenu d'une CString, utilise sa fonction membre GetBuffer(taille).
    En fait, c'est à peu près tout le code qui est bancal. C'est pour ça que je propose de carrément tout réécrire avec la STL [EDIT] : quoi qu'il y a probablement des solutions MFC plus abouties probablement.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Merci pour vos précieux conseils

Discussions similaires

  1. [WD9] Problème dernière ligne d'un fichier csv
    Par cactus666 dans le forum WinDev
    Réponses: 5
    Dernier message: 05/10/2007, 11h49
  2. [MySQL] Traitement de gros fichier CSV
    Par oceanbigone dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 03/07/2007, 11h40
  3. [Wamp] Problème à l'import d'un fichier csv
    Par Pokerstar dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 25/05/2007, 09h15
  4. [SQL] Problème exécution sql pour insertion fichier csv
    Par Kyvin dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 20/08/2006, 17h47
  5. Réponses: 1
    Dernier message: 20/10/2005, 10h32

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