00001
00002
00004
00005 #include "stdafx.h"
00006 #include "EvolveTraffic.h"
00007 #include "CSVParse.h"
00008
00009 #ifdef _DEBUG
00010 #undef THIS_FILE
00011 static char THIS_FILE[]=__FILE__;
00012 #define new DEBUG_NEW
00013 #endif
00014
00016
00018
00019 CCSVParse::CCSVParse()
00020 {
00021
00022 }
00023
00024 CCSVParse::~CCSVParse()
00025 {
00026
00027 }
00028
00029 bool CCSVParse::OpenFile(string inFile, string sep)
00030 {
00031 fin.open( inFile.c_str(), ios::in );
00032
00033 if(!fin)
00034 return false;
00035
00036 fieldsep = sep;
00037 return true;
00038 }
00039
00040 void CCSVParse::CloseFile()
00041 {
00042 fin.close();
00043 }
00044
00045
00046 int CCSVParse::endofline(char c)
00047 {
00048 int eol;
00049
00050 eol = (c=='\r' || c=='\n');
00051 if (c == '\r') {
00052 fin.get(c);
00053 if (!fin.eof() && c != '\n')
00054 fin.putback(c);
00055 }
00056 return eol;
00057 }
00058
00059
00060 int CCSVParse::getline(string& str)
00061 {
00062 char c;
00063
00064 for (line = ""; fin.get(c) && !endofline(c); )
00065 line += c;
00066 split();
00067 str = line;
00068 return !fin.eof();
00069 }
00070
00071
00072 int CCSVParse::split()
00073 {
00074 string fld;
00075 int i, j;
00076
00077 nfield = 0;
00078 if (line.length() == 0)
00079 return 0;
00080 i = 0;
00081
00082 do {
00083 if (i < line.length() && line[i] == '"')
00084 j = advquoted(line, fld, ++i);
00085 else
00086 j = advplain(line, fld, i);
00087 if (nfield >= field.size())
00088 field.push_back(fld);
00089 else
00090 field[nfield] = fld;
00091 nfield++;
00092 i = j + 1;
00093 } while (j < line.length());
00094
00095 return nfield;
00096 }
00097
00098
00099 int CCSVParse::advquoted(const string& s, string& fld, int i)
00100 {
00101 int j;
00102
00103 fld = "";
00104 for (j = i; j < s.length(); j++) {
00105 if (s[j] == '"' && s[++j] != '"') {
00106 int k = s.find_first_of(fieldsep, j);
00107 if (k > s.length())
00108 k = s.length();
00109 for (k -= j; k-- > 0; )
00110 fld += s[j++];
00111 break;
00112 }
00113 fld += s[j];
00114 }
00115 return j;
00116 }
00117
00118
00119 int CCSVParse::advplain(const string& s, string& fld, int i)
00120 {
00121 int j;
00122
00123 j = s.find_first_of(fieldsep, i);
00124 if (j > s.length())
00125 j = s.length();
00126 fld = string(s, i, j-i);
00127 return j;
00128 }
00129
00130
00131
00132 string CCSVParse::getfield(int n)
00133 {
00134 if (n < 0 || n >= nfield)
00135 return "";
00136 else
00137 return field[n];
00138 }
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158