解析普通的Python双精度列表
解析这样的行(元素数量不固定)的最佳方法是什么:
[ 0.0125, 2.9518e+02, 1.2833e+00, -3.5302e-04, 1.2095e+01, 1.0858e-01, 1.2112e-04, 1.1276e+03 ] # comments
在 C++ 中获取 double
的 std::vector
?我已经这样做了:
vector<double> read_line(string line)
{
vector<double> coefficients_line;
// erase all before [ and all after ]
size_t found1 = line.find("[");
if (found1 == string::npos) cerr << "line not valid: " << line;
line.erase(line.begin(), line.begin() + found1 + 1);
size_t found2 = line.find("]");
if (found2 == string::npos) cerr << "line not valid: " << line;
line.erase(line.begin() + found2, line.end());
vector<string> coefficients_string;
boost::split(coefficients_string, line, boost::is_any_of(","));
for (vector<string>::const_iterator ic=coefficients_string.begin();
ic!=coefficients_string.end(); ++ic)
{
cout << "c string \"" << *ic << "\"" << endl;
string s = *ic;
boost::trim(s);
double c = boost::lexical_cast<double>(s);
cout << "c double: " << c << endl;
coefficients.push_back(c);
}
return coefficients;
}
非提升,但欢迎简单的解决方案
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
考虑到格式,我认为使用 IO Streams 就足够简单了。
打印:(
在 ideone 上运行)
它不是一个完整的解析器,并且会接受不正确的输入(值得注意的是,它但我想说它已经相当不错了。
Given the format, I would think it is simple enough to use IO Streams.
Prints:
(In action at ideone)
It is not a full blown parser, and will accept incorrect inputs (notably, it does not check for the
]
at the end. But I would say it's pretty decent already.我发现您已经在使用
boost
。为此,您绝对应该尝试boost.spirit.qi
。我从
spirit
的文档中获取了parse_numbers()
函数,并对其进行了一些修改。当解析失败时(即不是格式良好的列表),它返回false,但当该行在列表之后有任何文本时返回true:第一个迭代器(main()
中的 >sb) 将指向号码列表结束的位置。请在此处查看完整文档:
http://www.boost.org /doc/libs/1_46_1/libs/spirit/doc/html/spirit/qi.html
I see you're already using
boost
. You should definitely tryboost.spirit.qi
for that purpose.I've taken the
parse_numbers()
function fromspirit
's documentation and adapted it a bit. It returns false when parsing has failed (i.e. not a well-formed list), but returns true when the line has any text after the list: the first iterator (sb
inmain()
) will point to where the number list has ended.See the full docs here:
http://www.boost.org/doc/libs/1_46_1/libs/spirit/doc/html/spirit/qi.html
如果你的编译器支持C++0x,那么你可以使用AX来解析这个字符串:
PS我还没有测试过它,所以可能会出现表面错误。
If your compiler supports C++0x, then you can use AXE to parse this string:
P.S. I haven't tested it, so superficial errors are possible.