$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
Subject: [boost] [spirit]
From: Chandrashekhar Kumar (iitk.cs_at_[hidden])
Date: 2009-06-04 14:58:54
Hi,
I have to parse the file, the contents of which(with a header) is below and
stuff the double part only to std::vector<double>:
"A","B","C","D"
1,2,3,4
5,6.7,8
........
I started simple without header approach first :
from libs/spirit/example/lex/example.hpp:
inline std::string
read_from_file(char const* infile)
{
std::ifstream instream(infile);
if (!instream.is_open()) {
std::cerr << "Couldn't open file: " << infile << std::endl;
exit(-1);
}
instream.unsetf(std::ios::skipws); // No white space skipping!
return std::string(std::istreambuf_iterator<char>(instream.rdbuf()),
std::istreambuf_iterator<char>());
}
from libs/spirit/classic/examples/number_list.hpp:
///////////////////////////////////////////////////////////////////////////////
//
// Our comma separated list parser
//
///////////////////////////////////////////////////////////////////////////////
bool
parse_numbers(char const* str, vector<double>& v)
{
return parse(str,
// Begin grammar
(
real_p[push_back_a(v)] >> *(',' >> real_p[push_back_a(v)])
)
,
// End grammar
space_p).full;
}
int main()
{
std::string str = read_from_file("test.csv");
std::vector<double> v;
if (parse_numbers(str.c_str(), v))
{
cout << "-------------------------\n";
cout << "Parsing succeeded\n";
cout << str << " Parses OK: " << endl;
for (vector<double>::size_type i = 0; i < v.size(); ++i)
cout << i << ": " << v[i] << endl;
cout << "-------------------------\n";
}
else
{
cout << "-------------------------\n";
cout << "Parsing failed\n";
cout << "-------------------------\n";
}
}
But after running it, I am getting the result as "Parsing failed".
I am going thru the doc to understand it better, but any quick spot will
help me immensely.
Thanks,
Chandra