私はこのcsv行を持っています
std::string s = R"(1997,Ford,E350,"ac, abs, moon","some "rusty" parts",3000.00)";
次を使用して解析できますboost::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;
}
トークン「rusty」に削除される二重引用符が必要であることを除いて、それは正しくなります。
これがboost::spiritを使用する私の試みです
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;
}
}
問題:
機能せず、最初のトークンのみを出力します
なぜブースト::スピリット::クラシック? Spirit V2 を使用した例が見つからない
セットアップは残忍です..しかし、私はこれで暮らすことができます
boost::spirit
**かなり速い傾向にあるのでどうしても使いたい
期待される出力:
1997
Ford
E350
ac, abs, moon
some "rusty" parts
3000.00