CSV像Parse(空白分隔符和boost)

CSV like Parse ( whitespace delimiter and boost )

本文关键字:boost 分隔符 空白 Parse CSV      更新时间:2023-10-16

我想解析一个类似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, ' ');

方法,它接受'任意'输出容器和分隔符表达式,参见这里:

  • 如何使我的分裂工作只在一个真正的行,并能够跳过引号部分的字符串?