像Parse一样的CSV(空白分隔符和提升)

时间:2015-06-10 08:54:21

标签: c++ boost

我想解析一个类似CSV的文件,与boost一致。 有许多不同的方法,如split,tokenise,spirit,regex ......

解析线可能如下所示:"abc" "def" "hij \"hgfd\" " 结果应如下所示:

"abc"
"def"
"hij \"hgfd\" "

我认为在escaped_list_separator中使用boost标记会是一个好主意,但不可能在空白分隔符上拆分,不是吗?

1 个答案:

答案 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|| '),请参阅此处:

           

对于非常非常非常完整的示例,完整支持部分引用的值和

"
     

采用'任意'输出容器和分隔符表达式的方法,请参见此处: