【发布时间】:2016-04-14 03:45:51
【问题描述】:
我正在尝试使用 boost.spirit 库为 csv 文件编写解析器。我遇到以下编译错误。我是 boost.spirit 的新手,有人能找出原因吗?
错误信息是:
错误 C2664: 'bool boost::spirit::qi::rule::parse(Iterator &,const Iterator &,Context &,const Skipper &,Attribute &) const': 无法从 'const char 转换参数 1 *' 到 'std::_String_iterator>> &'
我的代码是:
#pragma once
#define BOOST_SPIRIT_USE_PHOENIX_V3
#include<vector>
#include<string>
#include<memory>
#include<boost/iostreams/device/mapped_file.hpp> // for mmap
#include<boost/utility/string_ref.hpp>
#include<boost/spirit/include/qi.hpp>
#include<boost/spirit/include/qi_grammar.hpp>
#include<boost/spirit/include/qi_real.hpp>
#include<boost/spirit/include/phoenix.hpp>
#include<boost/spirit/include/qi_symbols.hpp>
typedef boost::string_ref CsvField;
typedef std::vector<CsvField> CsvLine;
typedef std::vector<CsvLine> CsvFile;
namespace qi = boost::spirit::qi;
template <typename T> struct CsvParser : qi::grammar<T, CsvFile()> {
CsvParser() : CsvParser::base_type(lines) {
using namespace qi;
using boost::phoenix::construct;
using boost::phoenix::size;
using boost::phoenix::begin;
using boost::spirit::qi::float_;
field = raw[*~char_(",\r\n")][_val = construct<CsvField>(begin(qi::_1), size(qi::_1))]; // semantic action
//field = qi::float_;
line = field % ',';
lines = line % eol;
}
// declare: line, field, fields
qi::rule<T, CsvFile()> lines;
qi::rule<T, CsvLine()> line;
qi::rule<T, CsvField()> field;
};
代码确实是从Simplest way to read a CSV file mapped to memory? 采用的,所以我没有任何线索。我正在使用 Microsoft Visual Studio 2015 和 boost 1.16.0。
如果我将typedef boost::string_ref CsvField 替换为typedef std::string,或将字段解析器替换为field = *(~char_(",\r\n")),则会出现同样的错误。
另外,我正在解析的文件实际上是一个标准的 csv 文件,因此欢迎提出其他解析方法的建议。唯一的问题是该文件有数百万行,因此标准的逐行解析对我不起作用。
【问题讨论】:
标签: c++ parsing csv boost boost-spirit