Program Listing for File IOUtil.h

Return to documentation for file (/home/kpenev/projects/git/poet/poet_src/IO/IOUtil.h)

#ifndef __IO_UTIL_H
#define __IO_UTIL_H

#include <iostream>
#include <valarray>
#include <list>

template<typename COLNUM_STRUCTURE>
std::vector< std::list<double> > parse_columns(
        std::istream &is,

        const COLNUM_STRUCTURE &column_numbers,

        bool csv = true
)
{
    int last_column=*max_element(column_numbers.begin(),
                                 column_numbers.end());
    std::string line;
    std::vector< std::list<double> > result(column_numbers.size());
    unsigned line_number=0;
    for(std::getline(is, line); !is.eof(); std::getline(is, line)) {
        ++line_number;
        if(!is.good()) {
            std::ostringstream msg;
            msg << "Failed to read line " << line_number
                << " of the data section of an input stream in "
                << "parse_columns.";
            throw Core::Error::IO(msg.str());
        }
        if(line[0]=='#') continue;
        std::istringstream line_stream(line);
        for(int column_number=0; column_number<=last_column;
                ++column_number) {
            std::ostringstream msg;
            msg << "Failed to parse column " << column_number
                << " on line " << line_number << " of the data section of an"
                " input stream in parse_columns.";
            if(!line_stream.good()) throw Core::Error::IO(msg.str());

            std::string word;
            if(csv) std::getline(line_stream, word, ',');
            else line_stream >> word;
            typename COLNUM_STRUCTURE::const_iterator
                colnum_iter=column_numbers.begin();
            for(size_t result_index=0; result_index<column_numbers.size();
                    ++result_index, ++colnum_iter)
                if(*colnum_iter==column_number) {
                    double value;
                    if(word == "NaN") value = Core::NaN;
                    else std::istringstream(word) >> value;
                    result[result_index].push_back(value);
                    break;
                }
            if(line_stream.bad()) throw Core::Error::IO(msg.str());
        }
    }
    return result;
}

#endif