51 votes

Comment puis-je lire et manipuler des données de fichier CSV en C ++?

Très explicite, j’ai essayé google et obtenu beaucoup d’expert redoutable expertsexchange, j’ai cherché ici aussi en vain. Un tutoriel ou un exemple en ligne serait préférable. Merci les gars.

56voto

Loki Astari Points 116129

Plus d'informations seraient utiles.

Mais la forme la plus simple:

 #include <iostream>
#include <sstream>
#include <fstream>
#include <string>

int main()
{
    std::ifstream  data("plop.csv");

    std::string line;
    while(std::getline(data,line))
    {
        std::stringstream  lineStream(line);
        std::string        cell;
        while(std::getline(lineStream,cell,','))
        {
            // You have a cell!!!!
        }
    }
 }
 

Voir aussi cette question: Analyseur CSV en C ++

21voto

uvts_cvs Points 4163

Vous pouvez essayer la bibliothèque Boost Tokenizer, en particulier le séparateur de liste échappée.

9voto

Tom Points 6758

Si ce que vous êtes vraiment en train de faire est de la manipulation d'un fichier CSV lui-même, Nelson réponse est logique. Cependant, je soupçonne que le CSV est tout simplement un artefact du problème que vous résolvez. En C++, cela veut probablement dire que vous avez quelque chose comme ce que votre modèle de données:

struct Customer {
    int id;
    std::string first_name;
    std::string last_name;
    struct {
        std::string street;
        std::string unit;
    } address;
    char state[2];
    int zip;
};

Ainsi, lorsque vous travaillez avec une collection de données, il est logique d'avoir std::vector<Customer> ou std::set<Customer>.

Avec cela à l'esprit, pensez à votre CSV de manipulation que deux opérations:

// if you wanted to go nuts, you could use a forward iterator concept for both of these
class CSVReader {
public:
    CSVReader(const std::string &inputFile);
    bool hasNextLine();
    void readNextLine(std::vector<std::string> &fields);
private:
    /* secrets */
};
class CSVWriter {
public:
    CSVWriter(const std::string &outputFile);
    void writeNextLine(const std::vector<std::string> &fields);
private:
    /* more secrets */
};
void readCustomers(CSVReader &reader, std::vector<Customer> &customers);
void writeCustomers(CSVWriter &writer, const std::vector<Customer> &customers);

Lire et écrire une seule ligne à la fois, plutôt que de garder une complète représentation en mémoire du fichier lui-même. Il y a quelques avantages évidents:

  1. Vos données sont représentées sous une forme qui fait sens pour votre problème (les clients), plutôt que de la solution actuelle (fichiers CSV).
  2. Vous pouvez trivialement ajouter des adaptateurs pour d'autres formats de données, tels que les en vrac SQL import/export Excel/OO fichiers de feuille de calcul, ou même HTML <table> rendu.
  3. Votre empreinte mémoire est vraisemblablement plus faible (dépend de la par rapport sizeof(Customer) vs le nombre d'octets dans une seule ligne).
  4. CSVReader et CSVWriter peuvent être réutilisés comme la base pour un modèle de mémoire (comme Nelson), sans perte de performances ou de fonctionnalités. L'inverse n'est pas vrai.

8voto

Marc Bernier Points 1789

J'ai travaillé avec beaucoup de fichiers CSV dans mon temps. Je tiens à ajouter les conseils:

1 - Selon la source (Excel, etc), des virgules ou des tabulations peuvent être intégrés dans un champ. Généralement, la règle est qu'ils seront "protégés" parce que le terrain sera double-quote délimité, comme dans "Boston, MA 02346".

2 - Certaines sources ne sera pas de guillemet double délimiter tous les champs de texte. Autres sources. D'autres vont délimiter tous les domaines, même les objets numériques.

3 - les Champs contenant des guillemets généralement obtenir de l'embedded guillemets doubles (et le champ lui-même délimité par des guillemets, comme dans "George ""Babe"" Ruth".

4 - Certaines sources intégrera CR/Epa (Excel est l'un de ceux-ci!). Parfois, c'est un CR. Le domaine sera généralement double-quote délimité, mais cette situation est très difficile à gérer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X