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