v0.3.9b:
[mldemos:baraks-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     std::string const& operator[](std::size_t index) const;
58     std::string at(size_t column) const;
59     std::string getFirstCell() const;
60     std::string getLastCell() const;
61     std::vector<std::string> getParsedLine() const;
62     std::size_t size() const;
63
64     void readNextRow(std::istream& str);
65
66 private:
67     std::vector<std::string>    m_data;
68 };
69
70 class CSVIterator
71 {
72 public:
73     typedef std::input_iterator_tag     iterator_category;
74     typedef CSVRow                      value_type;
75     typedef std::size_t                 difference_type;
76     typedef CSVRow*                     pointer;
77     typedef CSVRow&                     reference;
78
79     CSVIterator(std::istream& str);
80     CSVIterator();
81
82     bool eof();
83
84     // Pre Increment
85     CSVIterator& operator++();
86
87     // Post increment
88     CSVIterator operator++(int);
89
90     CSVRow const& operator*()   const;
91     CSVRow const* operator->()  const;
92     bool operator!=(CSVIterator const& rhs);
93     bool operator==(CSVIterator const& rhs);
94
95 private:
96     std::istream*       m_str;
97     CSVRow              m_row;
98 };
99
100 class CSVParser
101 {
102 public:
103     CSVParser();
104     void clear();
105     void parse(const char* fileName);
106     vector<size_t> getMissingValIndex();
107     void cleanData(unsigned int acceptedTypes);
108     pair<vector<fvec>,ivec> getData(ivec excludeIndex = ivec());
109     map<string,unsigned int> getOutputLabelTypes(bool reparse);
110     void setOutputColumn(unsigned int column);
111     bool hasData();
112     vector<unsigned int> getDataType(){return dataTypes;}
113     int getCount(){return data.size();}
114     vector< vector<string> > getRawData(){return data;}
115     static pair<vector<fvec>, ivec> numericFromRawData(vector< vector<string> > rawData);
116
117 private:
118     int outputLabelColumn;
119     ifstream file;
120     map<string,unsigned int> classLabels;
121     vector<vector<string> > data;
122     vector<unsigned int> dataTypes;
123 };
124
125 #endif // PARSER_H