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 :

Change caractère dans un fichier


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 38
    Par défaut Change caractère dans un fichier
    Bonjour,
    j'ouvre un fichier csv en c++, ce fichier est décomposé comme ceci:

    19/11/04,20/11/04,"100691","8MI","arret","6,75"

    j'ai une fonction qui me permet de changer un caractère dans tout le fichier une autre qui supprime tout les caractère d'un type et un séparateur.
    je voudrais récupérer le 6,75, il faudrait que je puisse changer "," et ," en ; par exemple et non pas que ,
    ou mieux si vous savez comment importer un fichier xls en c++ !

    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
     
    void SupprimeTousLesCaracteres( string &Str, char C )
    { 
        Str.erase(
        remove( Str.begin(), Str.end(), C ),
        Str.end() ); 
    }    
    void changeCaractere (string &str )
    {
      string::size_type i = 0;
      while ((i = str.find(",", 0)) != (string::npos))
      str.replace(i, 1, ";" );     
    }
     int Split(vector<string>& vecteur, string chaine, char separateur)
     {
     vecteur.clear();
     
     string::size_type stTemp = chaine.find(separateur);
     
     while(stTemp != string::npos)
     {
     vecteur.push_back(chaine.substr(0, stTemp));
     chaine = chaine.substr(stTemp + 1);
     stTemp = chaine.find(separateur);
     }
     
     vecteur.push_back(chaine);
     
    return vecteur.size();
    } 
     
     
    int main(int argc, char *argv[])
    {
         string tableau[1000][11];
         char* tab[1000][11];
         int i=0;
         int a=0;
         int nbTabl;
         string mon_fichier = "test1.csv";  // je stocke dans la chaîne mon_fichier le nom du fichier à ouvrir
         ifstream fichier(mon_fichier.c_str());
         if(fichier)  // si l'ouverture a réussi
         {
            string ligne;
            while(getline(fichier, ligne))  
            {                
               i=i+1;//compte le nb de lignes
     
               string test=ligne;
     
               SupprimeTousLesCaracteres( test, '"' );
     
               vector<string> VecStr;
               nbTabl = Split(VecStr, test, ',');
               a=a+1;
     
              for(int d = 0; d < nbTabl; ++d)
              {
               //cout << d << " : " << VecStr[d]<<endl  ;
               tableau[a][d]=VecStr[d];
     
               size_t size =  tableau[a][d].size() + 1;
               char * buffer = new char[ size ];
               // copier la chaîne
               strncpy( buffer,  tableau[a][d].c_str(), size );
               tab[a][d]=buffer;
     
     
               cout<<a<<":"<<d<<": "<<tab[a][d]<<endl;
              } 
            }
     
            fichier.close();  // je referme le fichier
            }         
             else  // sinon
                cerr << "Erreur à l'ouverture !" << endl;
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    Merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Par défaut
    Faut obligatoirement le faire en C++ ?

    Parce que si tu as à disposition un système Linux/Unix, tu peux utiliser un script à base de sed.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 17
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 57
    Par défaut
    Salut!

    Je propose une solution qui n'est peut-être pas la plus optimale en terme de temps mais propre et avec du code que tu pourras sans doute réutiliser:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    list<string> elements;
    string buffer;
     
    while( lire_element(fichier, buffer) )
    {
        //on stocke tous les éléments dans la liste
        elements.push_back(buffer);
    }
    Avec lire_element qui lit un élément du fichier et le stocke dans buffer:

    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
    bool lire_element(istream &fichier, string &buffer)
    {
        buffer = "";
        char c;
     
        while (1)
        {
           if (!(fichier >> c))
              return false;
           if (c == ',') //ou tout autre séparateur
              continue;
           if (c == '"')
           {
              //on lit le fichier jusqu'au prochain guillemet (modification à faire: prendre en compte les éventuels ' \" '
              while (1)
              {
                 if (!(fichier >> c))
                   throw "erreur de lecture, pas de guillemet fermant";
                 if (c == '"')
                   break;
                 buffer += c;
              }
              break;
            }
            //Sinon c'est une valeur qui n'est pas entourée par des guillemets, on va jusqu'à la prochaine virgule (ou tout autre séparateur)
            while (1)
            {
                 //modification à faire: vérifier que la fin de lecture résulte bien de la fin du fichier et pas d'une erreur
                 if (!(fichier >> c) || c == ',') 
                     break;
                 buffer += c;
            }
            break;
         }
         return true;
    }
    Une fois qu'on a la liste des éléments, il suffit de réécrire les éléments dans le fichier, séparés par des ';'.

  4. #4
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Le but, c'est bien de lire le CSV si j'ai bien compris ?

    Auquel cas, il faut faire attention au détail suivants :
    - si les valeurs contiennent des guillements, ils sont en général doublés, et la valeur doit être écrite entre guillemets
    - idem si la valeur contient des retours chariot, elle est en général écrite entre guillements
    - les guillements ne sont pas obligatoires dans les autres cas
    - le séparateur peut être tab, , ou ; , ça dépend...

    En fait, tu n'as pas d'autres moyen que de faire un vrai parcours du fichier... Les solutions à base de remplacement de caractère, etc, ça ne te mènera pas loin. Il y a toutes les chances que tu te plantes dès que quelqu'un passera un fichier un petit peu compliqué avec ce genre de solutions.

    (je ne suis pas sûr qu'il soit possible de lire correctement un csv avec sed)

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Par défaut
    Je parlais de sed pour remplacer les caracères, c'est vrai que pour récupérer les champs, il est préférable de faire un bon vieux script perl/awk.

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 38
    Par défaut
    D'abord je tient a vous remerciez tous pour votre aide, donc oui le but c'est de lire un fichier csv (car je n'arrive pas avec les xls), mais le problème c'est que le fichier contient des , que j'utilise comme séparateur et des , a conserver...
    Pour le code proposer par Dreambeliever je suis entrain de le tester...

Discussions similaires

  1. Réponses: 3
    Dernier message: 07/06/2006, 14h40
  2. [VB]Recherche d'une chaine de caractère dans un fichier
    Par Empty_body dans le forum VB 6 et antérieur
    Réponses: 26
    Dernier message: 16/02/2006, 09h10
  3. Ecriture d'une chaine de caractères dans un fichier
    Par fleur_de_rose dans le forum MFC
    Réponses: 6
    Dernier message: 10/02/2006, 09h34
  4. Réponses: 3
    Dernier message: 27/06/2005, 16h24
  5. Réponses: 5
    Dernier message: 25/01/2005, 14h26

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