|
inlib
1.2.0
|


Classes | |
| class | column |
Public Member Functions | |
| virtual void | start () |
| virtual bool | next () |
| virtual read::icol * | find_icol (const std::string &a_name) |
| virtual const std::vector < read::icol * > & | columns () const |
| ntuple (std::istream &a_reader) | |
| virtual | ~ntuple () |
| void | set_hippo (bool a_hippo) |
| std::istream & | istrm () |
| bool | initialize (std::ostream &a_out, char a_sep=0, const std::string &a_suffix="x", bool a_verbose=false) |
| void | dump_columns (std::ostream &a_out) const |
Static Public Member Functions | |
| static bool | find_sep (std::ostream &a_out, std::istream &a_reader, bool a_hippo, bool a_verbose, char &a_sep) |
| static const std::string & | s_cid (cid a_id) |
Protected Member Functions | |
| ntuple (const ntuple &a_from) | |
| ntuple & | operator= (const ntuple &a_from) |
| template<class T > | |
| column< T > * | create_column (const std::string &a_name) |
| bool | _read_line () |
Static Protected Member Functions | |
| static bool | _read (std::istream &a_reader, char, std::streampos, double &a_v) |
| static bool | _read (std::istream &a_reader, char a_sep, std::streampos a_sz, time_t &a_v) |
| static bool | _read (std::istream &a_reader, char a_sep, std::streampos a_sz, std::string &a_v) |
| static bool | read_line (std::istream &a_reader, std::streampos a_sz, std::string &a_s) |
| static bool | skip_line (std::istream &a_reader, std::streampos a_sz) |
| static bool | skip_comment (std::istream &a_reader, std::streampos a_sz) |
Protected Attributes | |
| std::istream & | m_reader |
| char | m_sep |
| std::vector< read::icol * > | m_cols |
| std::streampos | m_sz |
| bool | m_hippo |
Definition at line 37 of file rcsv_ntuple.
| inlib::rcsv::ntuple::ntuple | ( | std::istream & | a_reader | ) | [inline] |
| virtual inlib::rcsv::ntuple::~ntuple | ( | ) | [inline, virtual] |
Definition at line 173 of file rcsv_ntuple.
{
inlib::clear<read::icol>(m_cols);
#ifdef INLIB_MEM
mem::decrement(s_class().c_str());
#endif
}
| inlib::rcsv::ntuple::ntuple | ( | const ntuple & | a_from | ) | [inline, protected] |
| static bool inlib::rcsv::ntuple::_read | ( | std::istream & | a_reader, |
| char | , | ||
| std::streampos | , | ||
| double & | a_v | ||
| ) | [inline, static, protected] |
Definition at line 77 of file rcsv_ntuple.
{
a_reader >> a_v;
if(a_reader.tellg()==std::streampos(-1)) {a_v = 0;return false;}
//std::cout << "debug : _read(double) " << a_v << std::endl;
return true;
}
| static bool inlib::rcsv::ntuple::_read | ( | std::istream & | a_reader, |
| char | a_sep, | ||
| std::streampos | a_sz, | ||
| time_t & | a_v | ||
| ) | [inline, static, protected] |
Definition at line 85 of file rcsv_ntuple.
| static bool inlib::rcsv::ntuple::_read | ( | std::istream & | a_reader, |
| char | a_sep, | ||
| std::streampos | a_sz, | ||
| std::string & | a_v | ||
| ) | [inline, static, protected] |
Definition at line 102 of file rcsv_ntuple.
| bool inlib::rcsv::ntuple::_read_line | ( | ) | [inline, protected] |
Definition at line 507 of file rcsv_ntuple.
{
// have to loop on all columns !
typedef read::icol icol_t;
typedef ntuple::column<double> cold_t;
typedef ntuple::column<time_t> colt_t;
typedef ntuple::column<std::string> cols_t;
unsigned int index = 0;
unsigned int num = m_cols.size();
std::vector<icol_t*>::const_iterator it;
for(it=m_cols.begin();it!=m_cols.end();++it,index++) {
if(cold_t* cold = inlib::id_cast<icol_t,cold_t>(*(*it))) {
double v;
if(!_read(m_reader,m_sep,m_sz,v)) return false;
cold->set_value(v);
} else if(colt_t* colt = inlib::id_cast<icol_t,colt_t>(*(*it))) {
time_t v;
if(!_read(m_reader,m_sep,m_sz,v)) return false;
colt->set_value(v);
} else if(cols_t* cols = inlib::id_cast<icol_t,cols_t>(*(*it))) {
std::string v;
if(!_read(m_reader,m_sep,m_sz,v)) return false;
cols->set_value(v);
} else {
//std::cout << "column cast failed." << std::endl;
return false;
}
if(index==(num-1)) { //read up to LF()
char c;
while(true){
if(m_reader.tellg()>=m_sz) break;
m_reader.get(c);
if(c==LF()) break;
}
} else { //read sep :
char sep;
m_reader.get(sep);
}
}
return true;
}
| virtual const std::vector<read::icol*>& inlib::rcsv::ntuple::columns | ( | ) | const [inline, virtual] |
| column<T>* inlib::rcsv::ntuple::create_column | ( | const std::string & | a_name | ) | [inline, protected] |
Definition at line 460 of file rcsv_ntuple.
| void inlib::rcsv::ntuple::dump_columns | ( | std::ostream & | a_out | ) | const [inline] |
Definition at line 444 of file rcsv_ntuple.
{
if((m_sep>=32)&&(m_sep<=126)) { //printable
a_out << "separator is '" << m_sep << "'" << std::endl;
} else {
a_out << "separator is " << (unsigned int)m_sep << std::endl;
}
std::vector<read::icol*>::const_iterator it;
for(it=m_cols.begin();it!=m_cols.end();++it) {
a_out << (*it)->name()
<< " " << s_cid((*it)->id_cls())
<< std::endl;
}
}
| virtual read::icol* inlib::rcsv::ntuple::find_icol | ( | const std::string & | a_name | ) | [inline, virtual] |
Implements inlib::read::intuple.
Definition at line 71 of file rcsv_ntuple.
{
return find_named<read::icol>(m_cols,a_name);
}
| static bool inlib::rcsv::ntuple::find_sep | ( | std::ostream & | a_out, |
| std::istream & | a_reader, | ||
| bool | a_hippo, | ||
| bool | a_verbose, | ||
| char & | a_sep | ||
| ) | [inline, static] |
Definition at line 201 of file rcsv_ntuple.
{
// analyse first data line to find the char separator.
a_reader.clear();
a_reader.seekg(0,std::ios::end);
std::streampos sz = a_reader.tellg();
a_reader.seekg(0,std::ios::beg);
if(!sz) {
a_out << "inlib::rcsv::ntuple::find_sep :"
<< " stream is empty."
<< std::endl;
a_sep = 0;
return false;
} //file empty.
if(a_verbose) a_out << "file size " << sz << std::endl;
if(a_hippo) { //skip first two lines :
if(!skip_line(a_reader,sz)) {a_sep = 0;return false;}
if(!skip_line(a_reader,sz)) {a_sep = 0;return false;}
} else {
while(skip_comment(a_reader,sz)){}
}
if(a_reader.tellg()>=sz) {a_sep=0;return false;} //no data line.
// get first data line :
std::string sfirst;
{char c;
while(true) {
if(a_reader.tellg()>=sz) break;
a_reader.get(c);
if((c==CR())||(c==LF())) break;
sfirst += c;
}}
if(sfirst.empty()) {
a_out << "inlib::rcsv::ntuple::find_set :"
<< " first datat line is empty."
<< std::endl;
a_sep = 0;
return false;
}
if(a_verbose) a_out << "first data line \"" << sfirst << "\"" << std::endl;
//guess sep from first data line :
std::istringstream strm(sfirst.c_str());
double d;
strm >> d;
std::streampos pos = strm.tellg();
if(pos==std::streampos(-1)) {
a_out << "inlib::rcsv::ntuple::find_sep :"
<< " first line does not start with a number."
<< std::endl;
a_sep = 0;
return false;
} //not a number.
if(a_verbose) a_out << "first number " << d
<< " ending at pos " << pos << std::endl;
if(pos>=(std::streampos)sfirst.size()) {
a_out << "inlib::rcsv::ntuple::find_sep :"
<< " no separator found in first line."
<< " pos " << pos
<< " sfirst.size() " << sfirst.size()
<< std::endl;
a_sep = 0;
return false;
} //no sep.
strm.get(a_sep);
return true;
}
| bool inlib::rcsv::ntuple::initialize | ( | std::ostream & | a_out, |
| char | a_sep = 0, |
||
| const std::string & | a_suffix = "x", |
||
| bool | a_verbose = false |
||
| ) | [inline] |
Reimplemented in inlib::rcsv::fntuple.
Definition at line 276 of file rcsv_ntuple.
{
inlib::clear<read::icol>(m_cols);
m_sep = 0;
m_sz = 0;
if(a_suffix.empty()) {
a_out << "inlib::rcsv::ntuple::initialize :"
<< " expect a column suffix."
<< std::endl;
return false;
}
m_reader.clear();
m_reader.seekg(0,std::ios::end);
m_sz = m_reader.tellg();
m_reader.seekg(0,std::ios::beg);
if(!m_sz) {
a_out << "inlib::rcsv::ntuple::initialize :"
<< " stream is empty."
<< std::endl;
return false; //file empty.
}
if(a_verbose) a_out << "file size " << m_sz << std::endl;
std::vector<std::string> labels;
if(m_hippo) { //skip first two lines :
std::string title;
if(!read_line(m_reader,m_sz,title)) {a_sep = 0;return false;}
std::string s;
if(!read_line(m_reader,m_sz,s)) {a_sep = 0;return false;}
inlib::words(s,"\t",false,labels);
} else {
while(skip_comment(m_reader,m_sz)){}
}
if(m_reader.tellg()>=m_sz) {m_sz=0;return false;}
// get first data line :
std::string sfirst;
{{char c;
while(true) {
if(m_reader.tellg()>=m_sz) break;
m_reader.get(c);
if((c==CR())||(c==LF())) break;
sfirst += c;
}}
if(sfirst.empty()) {
a_out << "inlib::rcsv::ntuple::initialize :"
<< " first datat line is empty."
<< std::endl;
m_sz = 0;
return false;
}}
if(a_verbose) a_out << "first data line \"" << sfirst << "\"" << std::endl;
if(a_sep) {
m_sep = a_sep;
} else {
//guess sep from first data line :
std::istringstream strm(sfirst.c_str());
double d;
strm >> d;
std::streampos pos = strm.tellg();
if(pos==std::streampos(-1)) {
a_out << "inlib::rcsv::ntuple::initialize :"
<< " first line does not start with a number."
<< std::endl;
m_sz = 0;
return false;
}
if(a_verbose) a_out << "first number " << d
<< " ending at pos " << pos << std::endl;
if(pos>=(std::streampos)sfirst.size()) {
a_out << "inlib::rcsv::ntuple::initialize :"
<< " no separator found in first line."
<< std::endl;
m_sz = 0;
return false;
}
strm.get(m_sep);
}
if(a_verbose) a_out << "sep " << (int)m_sep << std::endl;
// in case sep is ' ', there is an ambiguity with some leading
// space in front of first number.
if(m_sep==' ') inlib::strip(sfirst,leading,' ');
std::vector<std::string> words;
{std::string sep;
sep += m_sep;
inlib::words(sfirst,sep,true,words);}
// look if words are numbers :
if(a_verbose) a_out << "words " << words.size() << std::endl;
unsigned int index = 0;
std::vector<std::string>::iterator it;
for(it=words.begin();it!=words.end();++it,index++) {
if(a_verbose) a_out << "word " << sout(*it) << "" << std::endl;
if((*it).empty()) {
// do not accept :
// <num><sep><num><sep><sep><num>...
// but accept a trailing <sep> (glast.tnt) :
// <num><sep><num>....<sep><num><sep>
if(index==(words.size()-1)) {
break;
} else {
a_out << "inlib::rcsv::ntuple::initialize :"
<< " empty word."
<< std::endl;
m_sep = 0;
m_sz = 0;
return false;
}
}
std::string name(a_suffix+to<unsigned int>(m_cols.size()));
if(m_hippo) {
if(index>=labels.size()) {
a_out << "inlib::rcsv::ntuple::initialize :"
<< " warning : not enough labels."
<< std::endl;
} else {
name = labels[index];
}
}
double d;
if(to<double>(*it,d)) {
if(a_verbose) a_out << "number " << d << std::endl;
create_column<double>(name);
} else {
time_t time;
if(s2time(*it,time)) {
create_column<time_t>(name);
} else {
create_column<std::string>(name);
}
}
}
unsigned int num = m_cols.size();
if(!num) {
a_out << "inlib::rcsv::ntuple::initialize :"
<< " zero columns."
<< std::endl;
m_sep = 0;
m_sz = 0;
return false;
}
return true;
}
| std::istream& inlib::rcsv::ntuple::istrm | ( | ) | [inline] |
Definition at line 199 of file rcsv_ntuple.
{return m_reader;}
| virtual bool inlib::rcsv::ntuple::next | ( | ) | [inline, virtual] |
Implements inlib::read::intuple.
Definition at line 47 of file rcsv_ntuple.
{
if(!m_sep) return false; //not inited.
if(m_reader.tellg()>=m_sz) return false;
// first time we are at bol but else we are at eol.
char c;
m_reader.get(c);
if(c==LF()){
if(m_reader.tellg()>=m_sz) {
//eof. Tell caller to stop looping on ntuple rows.
return false;
}
//eol. Next char read is going to be at bol.
} else {
m_reader.putback(c);
//bol
}
// ready for a new row :
while(skip_comment(m_reader,m_sz)){}
if(m_reader.tellg()>=m_sz) return false;
return _read_line();
}
Definition at line 191 of file rcsv_ntuple.
| static bool inlib::rcsv::ntuple::read_line | ( | std::istream & | a_reader, |
| std::streampos | a_sz, | ||
| std::string & | a_s | ||
| ) | [inline, static, protected] |
Definition at line 468 of file rcsv_ntuple.
| static const std::string& inlib::rcsv::ntuple::s_cid | ( | cid | a_id | ) | [inline, static] |
Definition at line 428 of file rcsv_ntuple.
{
if(a_id==_cid(double())) {
static const std::string s_v("double");
return s_v;
} else if(a_id==_cid(time_t())) {
static const std::string s_v("time");
return s_v;
} else if(a_id==_cid(std::string())) {
static const std::string s_v("string");
return s_v;
} else {
static const std::string s_v("unknown");
return s_v;
}
}
| void inlib::rcsv::ntuple::set_hippo | ( | bool | a_hippo | ) | [inline] |
Definition at line 197 of file rcsv_ntuple.
{m_hippo = a_hippo;}
| static bool inlib::rcsv::ntuple::skip_comment | ( | std::istream & | a_reader, |
| std::streampos | a_sz | ||
| ) | [inline, static, protected] |
Definition at line 492 of file rcsv_ntuple.
{
//ret true = we had a commented line, false : a data line or nothing.
if(a_reader.tellg()>=a_sz) return false;
//we should be at bol :
char c;
a_reader.get(c);
if(c=='#') {
return skip_line(a_reader,a_sz);
//eol. Next char should be bol.
} else {
a_reader.putback(c);
return false;
}
}
| static bool inlib::rcsv::ntuple::skip_line | ( | std::istream & | a_reader, |
| std::streampos | a_sz | ||
| ) | [inline, static, protected] |
Definition at line 482 of file rcsv_ntuple.
{
char c;
while(true) {
if(a_reader.tellg()>=a_sz) return false;
a_reader.get(c);
if(c==LF()) break;
}
return true;
}
| virtual void inlib::rcsv::ntuple::start | ( | ) | [inline, virtual] |
std::vector<read::icol*> inlib::rcsv::ntuple::m_cols [protected] |
Definition at line 550 of file rcsv_ntuple.
bool inlib::rcsv::ntuple::m_hippo [protected] |
Definition at line 552 of file rcsv_ntuple.
std::istream& inlib::rcsv::ntuple::m_reader [protected] |
Definition at line 548 of file rcsv_ntuple.
char inlib::rcsv::ntuple::m_sep [protected] |
Definition at line 549 of file rcsv_ntuple.
std::streampos inlib::rcsv::ntuple::m_sz [protected] |
Definition at line 551 of file rcsv_ntuple.
1.7.5.1