USGS

Isis 3.0 Object Programmers' Reference

Home

CSVReader.h
Go to the documentation of this file.
1 #ifndef CSVReader_h
2 #define CSVReader_h
3 
26 #include <QString>
27 #include <vector>
28 #include <fstream>
29 #include <tnt/tnt_array1d.h>
30 #include "CollectorMap.h"
31 #include "IException.h"
32 #include "IString.h"
33 
34 namespace Isis {
35 
80  template <typename TokenStore = QString>
81  class CSVParser {
82  public:
83  typedef TokenStore TokenType;
84  typedef TNT::Array1D<TokenType> TokenList;
85 
87  CSVParser() { }
89  virtual ~CSVParser() { }
90 
104  CSVParser(const QString &str, const char &delimiter = ',',
105  bool keepEmptyParts = true) {
106  parse(str, delimiter, keepEmptyParts);
107  }
108 
110  int size() const {
111  return (_elements.dim());
112  }
113 
125  const TokenType &operator()(const int nth) const {
126  return (_elements[nth]);
127  }
128 
146  int parse(const QString &str, const char &delimiter = ',',
147  bool keepEmptyParts = true) {
148  QStringList tokens =
149  str.split(delimiter, keepEmptyParts? QString::KeepEmptyParts : QString::SkipEmptyParts);
150  TokenList slist(tokens.size());
151  for(int i = 0 ; i < tokens.size() ; i++) {
152  slist[i] = TokenType(tokens[i]);
153  }
154  _elements = slist;
155  return (_elements.dim());
156  }
157 
165  TokenList result() const {
166  return (_elements);
167  }
168 
169  private:
171  };
172 
173 
174 
248  class CSVReader {
249 
250  private:
252 
253  public:
254  friend std::istream &operator>>(std::istream &is, CSVReader &csv);
255 
257  typedef TNT::Array1D<CSVAxis> CSVTable;
259 
260  typedef TNT::Array1D<double> CSVDblVector;
261  typedef TNT::Array1D<int> CSVIntVector;
262 
263  // Constructors and Destructor
264  CSVReader();
265  CSVReader(const QString &csvfile, bool header = false, int skip = 0,
266  const char &delimiter = ',', const bool keepEmptyParts = true,
267  const bool ignoreComments = true);
268 
270  virtual ~CSVReader() { }
271 
276  int size() const {
277  return (_lines.size());
278  }
279 
290  int rows() const {
291  int nrows(_lines.size() - firstRowIndex());
292  return ((nrows < 0) ? 0 : nrows);
293  }
294 
295  int columns() const;
296  int columns(const CSVTable &table) const;
297 
318  void setComment(const bool ignore = true) {
319  _ignoreComments = ignore;
320  }
321 
340  void setSkip(int nskip) {
341  if(nskip >= 0) _skip = nskip;
342  }
343 
352  int getSkip() const {
353  return (_skip);
354  }
355 
363  bool haveHeader() const {
364  return (_header);
365  }
366 
387  void setHeader(const bool gotIt = true) {
388  _header = gotIt;
389  }
390 
391 
404  void setDelimiter(const char &delimiter) {
405  _delimiter = delimiter;
406  }
407 
413  char getDelimiter() const {
414  return (_delimiter);
415  }
416 
426  _keepParts = true;
427  }
428 
440  _keepParts = false;
441  }
442 
448  bool keepEmptyParts() const {
449  return (_keepParts);
450  }
451 
452  void read(const QString &fname);
453 
454  CSVAxis getHeader() const;
455  CSVAxis getRow(int index) const;
456  CSVAxis getColumn(int index) const;
457  CSVAxis getColumn(const QString &hname) const;
458  CSVTable getTable() const;
459  bool isTableValid(const CSVTable &table) const;
460 
461  CSVColumnSummary getColumnSummary(const CSVTable &table) const;
462 
463  template <typename T> TNT::Array1D<T> convert(const CSVAxis &data) const;
464 
471  void clear() {
472  _lines.clear();
473  }
474 
475  private:
476  typedef std::vector<QString> CSVList;
477  bool _header;
478  int _skip;
479  char _delimiter;
480  bool _keepParts;
483 
493  int firstRowIndex() const {
494  return (_skip + ((_header) ? 1 : 0));
495  }
496 
497  std::istream &load(std::istream &ifile);
498  };
499 
500 
534  template <typename T>
535  TNT::Array1D<T> CSVReader::convert(const CSVAxis &data) const {
536  TNT::Array1D<T> out(data.dim());
537  for(int i = 0 ; i < data.dim() ; i++) {
538  Parser::TokenType s = data[i];
539  out[i] = toDouble(s);
540  }
541  return (out);
542  }
543 }
544 
545 
546 #endif
547