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.
Réponses
Trop de publicités?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 ++
Vous pouvez essayer la bibliothèque Boost Tokenizer, en particulier le séparateur de liste échappée.
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:
- 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).
- 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. - 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). -
CSVReader
etCSVWriter
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.
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.