我想解析一个类似CSV的文件,与boost一致。 有许多不同的方法,如split,tokenise,spirit,regex ......
解析线可能如下所示:"abc" "def" "hij \"hgfd\" "
结果应如下所示:
"abc"
"def"
"hij \"hgfd\" "
我认为在escaped_list_separator中使用boost标记会是一个好主意,但不可能在空白分隔符上拆分,不是吗?
答案 0 :(得分:1)
这里有一个快速而肮脏的东西,只与您使用Spirit描述的内容相匹配(多行代表向量>):
<强> Live On Coliru 强>
directory
示例打印:
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/qi_match.hpp>
namespace qi = boost::spirit::qi;
int main() {
std::vector<std::vector<std::string>> csv_data;
if (std::cin
>> std::noskipws
>> qi::phrase_match(*qi::lexeme['"' >> *('\\' >> qi::char_ | ~qi::char_("\r\n\"")) >> '"'] % qi::eol, qi::blank, csv_data))
{
std::cout << "Parse succeeded: " << csv_data.size() << "\n";
for(auto& row: csv_data) {
for(auto& c: row) std::cout << c << '|';
std::cout << "\n";
}
} else {
std::cout << "Parse failed\n";
}
}
有关解析(可选)引用分隔字段的背景信息,包括不同的引号字符(
Parse succeeded: 3 abc|def|hij "hgfd" | qwehjr|aweqwejkl||
,'
),请参阅此处:对于非常非常非常完整的示例,完整支持部分引用的值和
"
采用'任意'输出容器和分隔符表达式的方法,请参见此处: