【发布时间】:2013-08-24 07:11:09
【问题描述】:
我有这个 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;
}
它是正确的,除了标记“生锈”应该有双引号被剥离。
这是我使用 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;
}
}
问题:
不起作用,只打印第一个令牌
为什么是 boost::spirit::classic?找不到使用 Spirit V2 的示例
设置很残酷..但我可以忍受
** 我真的很想使用boost::spirit,因为它往往很快
预期输出:
1997
Ford
E350
ac, abs, moon
some "rusty" parts
3000.00
【问题讨论】:
-
我不明白您将如何将
""rusty""视为有效输入。如果引用的字符串没问题,那么我希望"embedded ""quotes"" like this",但不会意外""(空字符串)出现在字段中。 -
我已经编辑了字符串输入,希望双引号更有意义。
-
我不认为它现在更有意义了。报价数量不平衡。为什么不提供预期的输出?
-
刚刚发布的预期输出
-
我认为没有一种理智的方式可以以这种方式解释该输入。 '嵌入'引号 will 必须以一种或另一种方式转义(
""或例如\"),否则扫描无法确定是否到达字符串的末尾?我认为没有任何 CSV 引擎会这样对待它。
标签: c++ csv boost boost-spirit boost-spirit-qi