2011-07-08 3 views
1

J'ai un projet Visual Studio 2008 C++ où j'aimerais pouvoir prendre une liste de valeurs séparées par des virgules stockées dans un flux std :: strings et les mettre dans un vecteur comme ceci:désérialisation d'un flux csv vers un vecteur de structures

struct Foo 
{ 
    std::string A; 
    std::string B; 
    std::string C; 
} 

typedef std::vector<Foo> FooList; 

std::stringstream csv; // contains comma separated values 

tel que si le flux contenait "Ma Mère, Eats, \ nDonuts, de, Menards", la structure résultante serait:

{ { "My", "Mother", "Eats" }, 
    { "Donuts", "From", "Menards" } } 

Quelle est la meilleure façon d'y arriver ? Je regardais en utilisant boost.split s'il y a un moyen de spécifier comment la chaîne est copiée sur le vecteur. J'ai le contrôle sur les données de flux, donc si le formatage légèrement différent rend les choses plus faciles, je peux le faire.

+0

Way plus d'informations sur ce sujet ici: http://stackoverflow.com/questions/236129/how-to-split-a-string-in-c –

Répondre

4
// Input 
std::stringstream csv; 

// Prepare variables 
FooList v; 
std::vector<string> tokens(3); 
std::string line; 

// Iterate over lines 
while (std::getline(csv, tmp)) { 

    // Grab comma-delimited tokens 
    tokens.clear(); 
    boost::split(tokens, tmp, boost::is_any_of(",")); 

    // Verify line format 
    if (tokens.size() != 3) 
     throw "There weren't three entries in that line >.<"; 

    // Create and store `Foo` 
    Foo f = { tokens[0], tokens[1], tokens[2] }; 
    v.push_back(f); 
} 
+1

Jusqu'à la valeur est citée et contient une virgule: -D –

+0

@Vlad: Oui, jusqu'à ce que. L'OP n'a pas déclaré que c'était possible. OK, il n'a pas déclaré que ce n'était pas non plus, mais il a donné un exemple d'utilisation et aucune cotation n'était présente. –

+0

Dire juste. Ne t'inquiète pas :) –

1

Essayez:

std::stringstream csv; 

FooList v; 

std::string line;  
while (std::getline(csv, tmp)) 
{ 
    std::stringstream linestream(line); 

    Foo item; 
    std::getline(linestream, item.A, ','); 
    std::getline(linestream, item.B, ','); 
    std::getline(linestream, item.C, ','); 

    v.push_back(item); 
} 
+0

La vérification d'erreur échoue –

Questions connexes