Merged steph's changes.
[mldemos:mldemos.git] / _IOPlugins / CSVImport / parser.h
1 /*********************************************************************
2 MLDemos: A User-Friendly visualization toolkit for machine learning
3 Copyright (C) 2011 Chrstophe Paccolat
4 Contact: mldemos@b4silio.com
5
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public License,
8 version 3 as published by the Free Software Foundation.
9
10 This library is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free
17 Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *********************************************************************/
19
20 #ifndef PARSER_H
21 #define PARSER_H
22
23 #define UNSIGNED_INT_TYPE   1
24 #define INT_TYPE            2
25 #define FLOAT_TYPE          4
26 #define DOUBLE_TYPE         8
27 #define CHAR_TYPE           16
28 #define STRING_TYPE         32
29 #define UNKNOWN_TYPE        64
30 #define ALL_TYPES           127
31 #define NUMERIC_TYPES       (UNSIGNED_INT_TYPE | INT_TYPE | FLOAT_TYPE | DOUBLE_TYPE)
32
33 #define MISSING_VALUE        "?"
34
35 #include <map>
36 #include <iterator>
37 #include <iostream>
38 #include <fstream>
39 #include <sstream>
40 #include <vector>
41 #include <string>
42 #include <types.h>
43
44 using namespace std;
45
46 template<typename T>
47 bool is(const std::string &s)
48 {
49     std::istringstream stream(s);
50     T instance;
51     return ((stream >> instance) && (stream >> std::ws) && stream.eof());
52 }
53
54 class CSVRow
55 {
56 public:
57     CSVRow(std::string separator = ","):separator(separator){}
58     std::string const& operator[](std::size_t index) const;
59     std::string at(size_t column) const;
60     std::string getFirstCell() const;
61     std::string getLastCell() const;
62     std::vector<std::string> getParsedLine() const;
63     std::size_t size() const;
64
65     void readNextRow(std::istream& str);
66
67 private:
68     std::vector<std::string>    m_data;
69     string separator;
70 };
71
72 class CSVIterator
73 {
74 public:
75     typedef std::input_iterator_tag     iterator_category;
76     typedef CSVRow                      value_type;
77     typedef std::size_t                 difference_type;
78     typedef CSVRow*                     pointer;
79     typedef CSVRow&                     reference;
80
81     CSVIterator(std::istream& str, std::string separator=",");
82     CSVIterator();
83
84     bool eof();
85
86     // Pre Increment
87     CSVIterator& operator++();
88
89     // Post increment
90     CSVIterator operator++(int);
91
92     CSVRow const& operator*()   const;
93     CSVRow const* operator->()  const;
94     bool operator!=(CSVIterator const& rhs);
95     bool operator==(CSVIterator const& rhs);
96
97 private:
98     std::string separator;
99     std::istream*       m_str;
100     CSVRow              m_row;
101 };
102
103 class CSVParser
104 {
105 public:
106     CSVParser();
107     void clear();
108     void parse(const char* fileName);
109     vector<size_t> getMissingValIndex();
110     void cleanData(unsigned int acceptedTypes);
111     pair<vector<fvec>,ivec> getData(ivec excludeIndex = ivec(), int maxSamples=-1);
112     map<string,unsigned int> getOutputLabelTypes(bool reparse);
113     void setOutputColumn(unsigned int column);
114     void setFirstRowAsHeader(bool value){bFirstRowAsHeader = value;}
115     bool hasData();
116     vector<unsigned int> getDataType(){return dataTypes;}
117     int getCount(){return data.size();}
118     vector< vector<string> > getRawData(){return data;}
119     static pair<vector<fvec>, ivec> numericFromRawData(vector< vector<string> > rawData);
120
121 private:
122     bool bFirstRowAsHeader;
123     int outputLabelColumn;
124     ifstream file;
125     map<string,unsigned int> classLabels;
126     vector<vector<string> > data;
127     vector<unsigned int> dataTypes;
128 };
129
130 #endif // PARSER_H