【发布时间】:2017-01-19 10:34:37
【问题描述】:
使用 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;
}
【问题讨论】:
-
没有标准的 csv 库。为什么您如此热衷于避免使用第三方解决方案?
-
@BoBTFish 很乐意考虑基于第三方的答案。只是说明什么是这个用例的理想选择。
-
使用一个非常简单的状态机来解析每个字符。完毕。没有第 3 方库。
-
csv 看起来很简单,但可以包含很多极端情况。您应该首先阅读 wikipedia 对此的评论。恕我直言,您应该首先准确地指定您需要的内容(字段中的分隔符、字段中的引号字符、字段中的行尾等),构建一系列测试用例,然后实现它手动并测试您的实现。或者,选择一个 csv 库,控制其规格是否满足您的要求,对其进行测试并使用它。