C++ 类似CSV的解析(空格分隔符和boost)

C++ 类似CSV的解析(空格分隔符和boost),c++,boost,C++,Boost,我想解析一个类似CSV的文件,使用boost。 有许多不同的方法,如拆分、标记化、spirit、正则表达式 解析行可能如下所示:“abc”“def”“hij\“hgfd\” 结果应该是这样的: "abc" "def" "hij \"hgfd\" " 我认为使用boost的标记和转义的列表分隔符是一个好主意,但是不可能使用空格分隔符进行分割,不是吗?这里有一个快速而肮脏的方法来匹配您使用Spirit描述的内容(多行到一个向量>): #include <boost/spirit/inclu

我想解析一个类似CSV的文件,使用boost。 有许多不同的方法,如拆分、标记化、spirit、正则表达式

解析行可能如下所示:
“abc”“def”“hij\“hgfd\”
结果应该是这样的:

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

我认为使用boost的标记和转义的列表分隔符是一个好主意,但是不可能使用空格分隔符进行分割,不是吗?

这里有一个快速而肮脏的方法来匹配您使用Spirit描述的内容(多行到一个向量>):

#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";
    }
}
有关解析(可选)带引号分隔字段的背景信息,包括不同的引号字符(
),请参见此处:

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

splitInto(input, output, ' ');
方法获取“任意”输出容器和分隔符表达式,请参见此处:


CSV(和类似的文件格式)貌似很容易解析。我说的是貌似的,因为有很多角落的情况会导致问题,正如你所注意到的。要解决问题,你需要一个有状态的解析器,你需要保持一个状态,告诉你你正在解析哪种令牌。例如,如果状态说你在一个字符串中,你应该读取空格并将它们添加到t他把它当作场分隔符来对待,哇!那真的很有表现力!!!优雅!!!灵活!!!太棒了!你能写一些关于这个例子中使用的技巧吗?我对这个C++和Boost真的很新。通常我把ANSI C和一点点C++(旧标准)混合起来了。有没有一本书?谢谢。(我刚刚注意到我忘了直接将样本复制到答案中)@Roby books:-没有真正的增强书(但请参见)
splitInto(input, output, ' ');