使用C ++,我想分割字符串的行(在本例中为CSV文件),其中某些字段可能包含转义的分隔符(使用“”),应该被视为文字。我已经看过已经提出的各种问题,但没有找到我问题的直接答案。
CSV文件数据示例:
Header1,Header2,Header3,Header4,Header5
Hello,",,,","world","!,,!,",","
分割后所需的字符串向量:
["Hello"],[",,,"],["world"],["!,,!,"],[","]
注意:CSV仅在数据列数等于标题列数时有效。
更喜欢非增强/第三方解决方案。效率不是优先事项。
修改 从@ClasG实现正则表达式的代码至少满足上面的场景。我正在起草边缘测试案例,但很想知道它何时/何地发生故障......
std::string s = "Hello,\",,,\",\"world\",\"!,,!,\",\",\"\"";
std::string rx_string = "(\"[^\"]*\"|[^,]*)(?:,|$)";
regex e(rx_string);
std::regex_iterator<std::string::iterator> rit ( s.begin(), s.end(), e );
std::regex_iterator<std::string::iterator> rend;
while (rit!=rend)
{
std::cout << rit->str() << std::endl;
++rit;
}
答案 0 :(得分:1)
这不是一个完整的(c ++)解决方案,而是一个可能会让你朝着正确的方向努力的正则表达式。
像
这样的正则表达式("[^"]*"|[^,]*)(?:,|$)
将匹配各列。 (请注意,它不会处理转义的引号。)
答案 1 :(得分:1)
这不是答案,但作为评论恕我直言太久了。
CSV是一种看似简单但实际上非常恶劣的存储格式。
你正在寻找的机器人是Boost.Spirit。
Spirit Master的名字(堆栈溢出)是@sehe。
请在此处查看答案:https://stackoverflow.com/a/18366335/2015579
请相信,而不是我。