00001 #include <iostream>
00002 #include <cstdlib>
00003 #include "csvparser.h"
00004 #include "../PartB/yieldCurve.h"
00005 #include "../PartF/creditCurve.h"
00006 #include "StringTokenizer.h"
00007 using namespace std;
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 CSVParser::CSVParser()
00042 {
00043 m_sData = "";
00044 m_nPos = 0;
00045 }
00046
00047 void CSVParser::SkipSpaces(void)
00048 {
00049 while (m_nPos < m_sData.length() && m_sData[m_nPos] == ' ')
00050 m_nPos++;
00051 }
00052
00053 const CSVParser & CSVParser::operator <<(const string & sIn)
00054 {
00055 this->m_sData = sIn;
00056 this->m_nPos = 0;
00057 return *this;
00058 }
00059
00060 const CSVParser & CSVParser::operator <<(const char *sIn)
00061 {
00062 this->m_sData = sIn;
00063 this->m_nPos = 0;
00064 return *this;
00065 }
00066
00067 CSVParser & CSVParser::operator >>(int & nOut)
00068 {
00069 string sTmp = "";
00070 SkipSpaces();
00071 while (m_nPos < m_sData.length() && m_sData[m_nPos] != ',')
00072 sTmp += m_sData[m_nPos++];
00073
00074 m_nPos++;
00075 nOut = atoi(sTmp.c_str());
00076 return *this;
00077 }
00078
00079 CSVParser & CSVParser::operator >>(Natural & nOut)
00080 {
00081 return operator>>((int &)nOut);
00082 }
00083
00084 CSVParser & CSVParser::operator >>(double & nOut)
00085 {
00086 string sTmp = "";
00087 SkipSpaces();
00088 while (m_nPos < m_sData.length() && m_sData[m_nPos] != ',')
00089 sTmp += m_sData[m_nPos++];
00090
00091 m_nPos++;
00092 nOut = atof(sTmp.c_str());
00093 return *this;
00094 }
00095
00097 CSVParser & CSVParser::operator >>(TypeOfRate & tOut)
00098 {
00099 string sTmp = "";
00100 SkipSpaces();
00101 while (m_nPos < m_sData.length() && m_sData[m_nPos] != ',')
00102 sTmp += m_sData[m_nPos++];
00103
00104 m_nPos++;
00105 tOut = (strcmp(sTmp.c_str(), yieldPoint::TypeAsString(Cash)) == 0 ? Cash : Swap);
00106
00107 return *this;
00108 }
00109
00111 CSVParser & CSVParser::operator >>(CreditSpreadType & tOut)
00112 {
00113 string sTmp = "";
00114 SkipSpaces();
00115 while (m_nPos < m_sData.length() && m_sData[m_nPos] != ',')
00116 sTmp += m_sData[m_nPos++];
00117
00118 m_nPos++;
00119 tOut = (strcmp(sTmp.c_str(),
00120 CreditSpreadPoint::TypeAsString(Absolute)) == 0 ?
00121 Absolute : Relative);
00122
00123 return *this;
00124 }
00125
00126
00127 CSVParser & CSVParser::operator >>(string & sOut)
00128 {
00129 bool bQuotes = false;
00130 sOut = "";
00131 SkipSpaces();
00132
00133
00134 if (m_nPos < m_sData.length() && m_sData[m_nPos] == '"') {
00135 bQuotes = true;
00136 m_nPos++;
00137 }
00138
00139 while (m_nPos < m_sData.length()) {
00140 if (!bQuotes && m_sData[m_nPos] == ',')
00141 break;
00142 if (bQuotes && m_sData[m_nPos] == '"') {
00143 if (m_nPos + 1 >= m_sData.length() - 1)
00144 break;
00145 if (m_sData[m_nPos+1] == ',')
00146 break;
00147 }
00148 sOut += m_sData[m_nPos++];
00149 }
00150
00151
00152 if (bQuotes && m_nPos < m_sData.length() && m_sData[m_nPos] == '"')
00153 m_nPos++;
00154
00155
00156 if (m_nPos < m_sData.length() && m_sData[m_nPos] == ',')
00157 m_nPos++;
00158
00159 return *this;
00160 }
00161
00162 CSVParser & CSVParser::operator >> (Date &dOut)
00163 {
00164 string sTmp = "";
00165 SkipSpaces();
00166 while (m_nPos < m_sData.length() && m_sData[m_nPos] != ',')
00167 sTmp += m_sData[m_nPos++];
00168
00169 m_nPos++;
00170
00171 StringTokenizer strtok(sTmp, "-");
00172 Day d = (Day)strtok.nextIntToken();
00173 Month m = (Month)strtok.nextIntToken();
00174 Year y = (Year)strtok.nextIntToken();
00175
00176 dOut = Date(d, m, y);
00177
00178 return *this;
00179 }