CSV像Parse(空白分隔符和boost)
CSV like Parse ( whitespace delimiter and boost )
我想解析一个类似csv的文件,行与boost。有许多不同的方法,如split, tokenise, spirit, regex…
解析行可能看起来像:"abc" "def" "hij "hgfd" "
结果应该是这样的:
"abc"
"def"
"hij "hgfd" "
我认为使用boost的标记与escaped_listrongeparator将是一个好主意,但它是不可能分割空白分隔符,不是吗?
这里有一个快速而肮脏的方法来匹配您使用Spirit描述的内容(多行组成一个向量>):
Live On Coliru
#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_("rn"")) >> '"'] % 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 failedn";
}
}
打印示例:
Parse succeeded: 3
abc|def|hij "hgfd" |
qwehjr|aweqwejkl||
有关解析(可选)用引号分隔的字段的背景知识,包括不同的引号字符(
'
,"
),请参阅这里:
- 使用boost::spirit解析引号字符串
对于非常,非常,非常完整的示例,包括支持部分引用的值和
splitInto(input, output, ' ');
方法,它接受'任意'输出容器和分隔符表达式,参见这里:
- 如何使我的分裂工作只在一个真正的行,并能够跳过引号部分的字符串?
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- boost::进程间消息队列引发错误
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- cmake如何在fedora工作站中找到boost静态库包
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 使用 boost::split 按分隔符的前 N 次匹配来拆分字符串
- 使用 BOOST 分词器显示分隔符,并且不对引号中的字符串进行分词
- 如何使用 boost::split 拆分字符串并保留分隔符
- 使用boost::spirit::qi来解析带有分隔符的数字
- Boost.Tokenizer如何不从令牌中删除分隔符
- 使用 boost::spirit 将元素解析为矢量,使用分号或换行符作为分隔符
- 在使用boost拆分方法时,我可以使用字符串作为分隔符吗
- boost::tokenizer来考虑分隔符之间是否缺少令牌
- 使用空格作为boost::char_separator中的分隔符
- 读取直到boost::asio::streambuf中的字符串分隔符
- 使用 Boost.File system 获取平台的路径分隔符
- 标准/ Boost工具,用于推进迭代器,直到命中结束符或分隔符
- 具有多个分隔符的字符串标记器,包括不带Boost的分隔符
- CSV像Parse(空白分隔符和boost)
- boost::char_separator(用于boost::tokenizer)的默认字符分隔符是什么?