Wie man csv mit boost :: spirit parst

Ich habe diese CSV-Zeile

std::string s = R"(1997,Ford,E350,"ac, abs, moon","some "rusty" parts",3000.00)";

Ich kann es mit analysierenboost::tokenizer:

typedef boost::tokenizer< boost::escaped_list_separator<char> , std::string::const_iterator, std::string> Tokenizer;
boost::escaped_list_separator<char> seps('\\', ',', '\"');
Tokenizer tok(s, seps);
for (auto i : tok)
{
    std::cout << i << std::endl;
}

Es macht es richtig, außer Token "rostig" sollte doppelte Anführungszeichen haben, die abgestreift werden.

Hier ist mein Versuch, boost :: spirit zu verwenden

boost::spirit::classic::rule<> list_csv_item = !(boost::spirit::classic::confix_p('\"', *boost::spirit::classic::c_escape_ch_p, '\"') | boost::spirit::classic::longest_d[boost::spirit::classic::real_p | boost::spirit::classic::int_p]);
std::vector<std::string> vec_item;
std::vector<std::string>  vec_list;
boost::spirit::classic::rule<> list_csv = boost::spirit::classic::list_p(list_csv_item[boost::spirit::classic::push_back_a(vec_item)],',')[boost::spirit::classic::push_back_a(vec_list)];
boost::spirit::classic::parse_info<> result = parse(s.c_str(), list_csv);
if (result.hit)
{
  for (auto i : vec_item)
  {
    cout << i << endl;
   }
}

Probleme:

funktioniert nicht, druckt nur das erste Token

warum boost :: spirit :: classic? Ich kann keine Beispiele mit Spirit V2 finden

Das Setup ist brutal .. aber ich kann damit leben

** Ich möchte wirklich verwendenboost::spirit weil es ziemlich schnell ist

Erwartete Ausgabe:

1997
Ford
E350
ac, abs, moon
some "rusty" parts

3000,00

Antworten auf die Frage(2)

Ihre Antwort auf die Frage