6
#include <boost/algorithm/string/classification.hpp>
7
#include <boost/algorithm/string/split.hpp>
8
#include <boost/algorithm/string/trim.hpp>
9
#include <boost/lambda/lambda.hpp>
10
#include <boost/lambda/bind.hpp>
11
#include <boost/lexical_cast.hpp>
13
#include <boost/date_time/time_formatting_streams.hpp>
14
#include <boost/date_time/local_time/local_time.hpp>
15
#include <boost/date_time/local_time/local_time_io.hpp>
16
#include <boost/date_time/posix_time/posix_time.hpp>
17
#include <boost/date_time/microsec_time_clock.hpp>
18
#include <boost/date_time/c_local_time_adjustor.hpp>
19
#include <boost/date_time/local_time_adjustor.hpp>
26
using namespace boost;
27
using namespace boost::lambda;
28
using namespace boost::date_time;
29
using namespace boost::local_time;
30
using namespace boost::posix_time;
32
typedef boost::split_iterator<string::iterator> string_split_iterator;
36
void CSVCustom<EC>::set_date_format(string &format) {
42
void CSVCustom<EC>::get_headers(std::vector<string> &headers) {
45
if (std::getline(*CSVCustom<EC>::csv_stream, s, '\n')) {
46
s.split(headers, ',');
48
throw invalid_argument("No data is supplied");
53
void CSVCustom<EC>::parse_time(boost::posix_time::ptime &parsed_time, std::string &string_time) {
54
boost::date_time::time_input_facet<ptime,char> *csv_facet = new boost::date_time::time_input_facet<ptime,char>(date_format);
55
std::locale csv_time_locale(std::locale::classic(), csv_facet);
57
stringstream ss(string_time);
58
ss.exceptions(std::ios_base::failbit);
59
ss.imbue(csv_time_locale);
65
bool CSVCustom<EC>::get_row(boost::posix_time::ptime &header, vector<EC> &data) {
70
while (std::getline(*CSVCustom<EC>::csv_stream, s, '\n')) {
71
ds::split_iterator i = s.create_split_iterator(',');
72
if (i == ds::split_iterator()) continue;
75
parse_time(header, s1);
77
for (++i; i!=ds::split_iterator(); ++i) {
78
data.push_back(lexical_cast<EC>(*i));
86
bool CSVCustom<EC>::get_row(boost::posix_time::ptime &header, std::size_t n_columns, EC *column) {
89
while (std::getline(*CSVCustom<EC>::csv_stream, s, '\n')) {
90
ds::split_iterator i = s.create_split_iterator(',');
91
if (i == ds::split_iterator()) continue;
94
parse_time(header, s1);
97
for (++i; i != ds::split_iterator(); ++i, ++counter) {
98
if (counter == n_columns) break;
99
column[counter] = lexical_cast<EC>(*i);
102
for (;counter < n_columns; ++counter) {
103
column[counter] = lexical_cast<EC>(0);
113
bool CSVCustom<EC>::get_row(time_t &header, vector<EC> &data) {
114
boost::posix_time::ptime cpp_time;
115
if (get_row(cpp_time, data)) {
116
// header = mktime(&to_tm(tm));
117
boost::posix_time::ptime epoch(boost::gregorian::date(1970,1,1));
118
header = (cpp_time - epoch).total_seconds();
124
template <class TElement>
125
bool CSVCustom<TElement>::get_row(time_t &header, std::size_t n_columns, TElement *column) {
126
boost::posix_time::ptime cpp_time;
127
if (get_row(cpp_time, n_columns, column)) {
128
boost::posix_time::ptime epoch(boost::gregorian::date(1970,1,1));
129
header = (cpp_time - epoch).total_seconds();
137
bool CSVCustom<EC>::skip_rows(boost::posix_time::ptime to) {
142
template class CSVCustom<>;