00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "CsvParser.h"
00021 #include <iostream>
00022 #include <cstdlib>
00023 #include <fstream>
00024
00025 using namespace std;
00026
00027 namespace mdw
00028 {
00029
00030 CsvParser::CsvParser (const string &fileName) : _file (fileName.c_str())
00031 {
00032 getline (_file, _currentLine);
00033 _nPos = 0;
00034 string header;
00035 while (true)
00036 {
00037 *this >> header;
00038 if (header.empty())
00039 {
00040 break;
00041 }
00042 _header.push_back (header);
00043 }
00044 }
00045
00046 bool CsvParser::nextLine()
00047 {
00048 if (_file.eof())
00049 {
00050 return false;
00051 }
00052 getline (_file, _currentLine);
00053 if (_currentLine.empty())
00054 {
00055 return false;
00056 }
00057 }
00058
00059 void CsvParser::skipSpaces (void)
00060 {
00061 while (_nPos < _currentLine.length() && _currentLine[_nPos] == ' ')
00062 _nPos++;
00063 }
00064
00065 CsvParser & CsvParser::operator >> (int & nOut)
00066 {
00067 string sTmp = "";
00068 skipSpaces();
00069 while (_nPos < _currentLine.length() && _currentLine[_nPos] != ',')
00070 sTmp += _currentLine[_nPos++];
00071
00072 _nPos++;
00073 nOut = atoi (sTmp.c_str());
00074 return *this;
00075 }
00076
00077 CsvParser & CsvParser::operator >> (long & nOut)
00078 {
00079 string sTmp = "";
00080 skipSpaces();
00081 while (_nPos < _currentLine.length() && _currentLine[_nPos] != ',')
00082 sTmp += _currentLine[_nPos++];
00083
00084 _nPos++;
00085 nOut = atoi (sTmp.c_str());
00086 return *this;
00087 }
00088
00089 CsvParser & CsvParser::operator >> (bool & out)
00090 {
00091 string sTmp = "";
00092 skipSpaces();
00093 while (_nPos < _currentLine.length() && _currentLine[_nPos] != ',')
00094 sTmp += _currentLine[_nPos++];
00095
00096 _nPos++;
00097 out = (sTmp == "true");
00098 return *this;
00099 }
00100
00101 CsvParser & CsvParser::operator >> (double & nOut)
00102 {
00103 string sTmp = "";
00104 skipSpaces();
00105 while (_nPos < _currentLine.length() && _currentLine[_nPos] != ',')
00106 sTmp += _currentLine[_nPos++];
00107
00108 _nPos++;
00109 nOut = atof (sTmp.c_str());
00110 return *this;
00111 }
00112
00113 CsvParser & CsvParser::operator >> (string & sOut)
00114 {
00115 bool bQuotes = false;
00116 sOut = "";
00117 skipSpaces();
00118
00119
00120 if (_nPos < _currentLine.length() && _currentLine[_nPos] == '"')
00121 {
00122 bQuotes = true;
00123 _nPos++;
00124 }
00125
00126 while (_nPos < _currentLine.length())
00127 {
00128 if (!bQuotes && _currentLine[_nPos] == ',')
00129 break;
00130 if (bQuotes && _currentLine[_nPos] == '"')
00131 {
00132 if (_nPos + 1 >= _currentLine.length() - 1)
00133 break;
00134 if (_currentLine[_nPos+1] == ',')
00135 break;
00136 }
00137 sOut += _currentLine[_nPos++];
00138 }
00139
00140
00141 if (bQuotes && _nPos < _currentLine.length() && _currentLine[_nPos] == '"')
00142 _nPos++;
00143
00144
00145 if (_nPos < _currentLine.length() && _currentLine[_nPos] == ',')
00146 _nPos++;
00147
00148 return *this;
00149 }
00150 }