OSDN Git Service

rm latex/
[moflib/moflib.git] / oldmof / CSVFile.cpp
1 #include "mof/CSVFile.h"
2 #include <exception>
3 #include <stdlib.h>
4 #include "mof/ConsoleIO.h"
5
6 mof::CSVFile::CSVFile(mof::tstring& filename)
7 : m_ifs(filename.c_str() , std::ios::in) , m_bufferSize(1024){
8         if(!m_ifs)throw std::invalid_argument("can't open file");
9         m_buffer = new TCHAR[m_bufferSize+1];//\92Ç\89Á\83k\83\8b\95\8e\9a\82Ì\82½\82ß\82É\82P\82Â\97]\95ª\82É\8am\95Û
10         m_buffer[m_bufferSize] = '\0';
11         m_topOfBuffer = m_bufferSize-1;
12         m_hasBufferedValue = false;
13         m_ignoreNL = true;
14         m_pBufferedValue = NULL;
15         nextLine();
16 }
17
18
19
20 mof::CSVFile::CSVFile(const TCHAR* filename)
21 : m_ifs(filename , std::ios::in) , m_bufferSize(1024){
22         if(!m_ifs)throw std::invalid_argument("can't open file");
23         m_buffer = new TCHAR[m_bufferSize+1];//\92Ç\89Á\83k\83\8b\95\8e\9a\82Ì\82½\82ß\82É\82P\82Â\97]\95ª\82É\8am\95Û
24         m_buffer[m_bufferSize] = '\0';
25         m_topOfBuffer = m_bufferSize-1;
26         m_hasBufferedValue = false;
27         m_ignoreNL = true;
28         m_pBufferedValue = NULL;
29
30
31         nextLine();
32 }
33
34
35 mof::CSVFile::~CSVFile(){
36         delete[] m_buffer;
37         
38 }
39
40 bool mof::CSVFile::hasNextValue(){
41         if(m_hasBufferedValue)return true;//Value\82Ì\83o\83b\83t\83@\82ª\82 \82é
42         
43         //if(m_topOfBuffer == m_bufferSize && !nextLine())return false;//\82±\82ê\82ª\82È\82¢\82Æ\83o\83O\82é\82ª\81A\89º\82Ì\83\8b\81[\83`\83\93\82Æ\88ê\96{\89»\82Å\82«\82È\82¢\82©
44
45         while(!updateNextValue() && m_ignoreNL){
46                 if( m_topOfBuffer >= m_bufferSize ||  m_buffer[m_topOfBuffer] == '\0'){
47                         //\83o\83b\83t\83@\82ð\93Ç\82Ý\8d\9e\82Þ
48                         m_topOfBuffer = m_ifs.getline(m_buffer , m_bufferSize) ? 0 : m_bufferSize;
49                         if(m_topOfBuffer >= m_bufferSize)return false;
50                 }
51         }
52         return m_pBufferedValue != NULL;
53
54         //if(m_topOfBuffer == m_bufferSize)
55 }
56
57
58
59 const TCHAR* mof::CSVFile::getNextValue(){
60         if(m_hasBufferedValue && hasNextValue()){//Value\82Ì\83o\83b\83t\83@\82ª\82 \82ê\82Î\82»\82ê\82ð\8eg\82¤
61                 m_hasBufferedValue = false;
62                 return m_pBufferedValue;
63         }
64
65         //\8e\9f\82Ì\92l\82ª\82È\82¢\8fê\8d\87
66         return NULL;
67
68 }
69
70
71
72
73 bool mof::CSVFile::nextLine(){
74         m_hasBufferedValue = false;
75         m_topOfBuffer = m_ifs.getline(m_buffer , m_bufferSize) ? 0 : m_bufferSize;
76         return m_topOfBuffer == 0;
77 }
78
79
80 void mof::CSVFile::setIgnoreNL(bool ignore){
81         m_ignoreNL = ignore;
82 }
83
84
85
86 bool mof::CSVFile::updateNextValue(){
87
88         if(m_topOfBuffer == m_bufferSize){
89                         //\92l\82È\82µ
90                         m_pBufferedValue = NULL;
91                         m_hasBufferedValue = false;
92                         return false;
93         }
94
95         enum{
96                 ISPACE , ICOMMA , IQUOTE , IWORD , IEOF
97         };
98         enum{
99                 S , NQV , QV , NQE , QE , QVQ ,
100                 //\8f\89\8aú\8fó\91Ô\81A\94ñ\83N\83H\81[\83g\92l\81A\83N\83H\81[\83g\92l\81A\94ñ\83N\83H\81[\83g\83G\83X\83P\81[\83v\81A\83N\83H\81[\83g\83G\83X\83P\81[\83v\81A\83N\83H\81[\83g\82Å\88Í\82Ü\82ê\82½\92l
101                 _NULL , _EMP , _V , _ERR , _QVQ
102                 //\92l\82È\82µ\81A\8bó\95\8e\9a\97ñ\81A\92l\81A\83G\83\89\81[\81A\83N\83H\81[\83g\82Å\88Í\82Ü\82ê\82½\92l
103         };
104         static const int stateChangeTable[][5] = {
105                 { S , _EMP , QV , NQV , _NULL } ,
106                 { NQV , _V , NQE , NQV , _V} ,
107                 { QV , QV , QE , QV , _ERR} ,
108                 { _ERR , _ERR , NQV , _ERR , _ERR} ,
109                 { QVQ , _QVQ , QV , _ERR , _QVQ} ,
110                 { QVQ , _QVQ , _ERR , _ERR , _QVQ}
111                 
112         };
113         
114
115         int state = S;
116         int lastInput = IEOF;
117         int begin = m_topOfBuffer;
118         while( state < _NULL ){//\8fI\97¹\8fó\91Ô\82É\82È\82Á\82½\82ç\94²\82¯\82é
119                 lastInput = IWORD;
120                 if( m_buffer[m_topOfBuffer] == '\0'){
121                         lastInput = IEOF;
122                 }
123                 else if( m_buffer[m_topOfBuffer] == ' ')lastInput = ISPACE;
124                 else if(m_buffer[m_topOfBuffer] == '"')lastInput = IQUOTE;
125                 else if(m_buffer[m_topOfBuffer] == ',')lastInput = ICOMMA;
126                 state = stateChangeTable[state][lastInput];
127                 m_topOfBuffer++;
128         }
129         m_hasBufferedValue = true;
130
131         if(state == _NULL){
132                 //\92l\82È\82µ
133                 m_pBufferedValue = NULL;
134                 m_topOfBuffer = m_bufferSize;
135                 m_hasBufferedValue = false;
136                 return false;
137         }
138         else if(state == _EMP){
139                 m_pBufferedValue = "";
140                 return true;
141         }
142         else if(state == _V || state == _QVQ){
143                 int end = m_topOfBuffer-2;
144                 //\91O\8cã\82©\82ç\83g\83\8a\83~\83\93\83O
145                 while(m_buffer[begin] == ' ')begin++;
146                 while(m_buffer[end] == ' ' )end--;
147
148                 if(state == _QVQ){
149                         //\97¼\92[\82Ì\81h\82ð\8f\9c\8b\8e
150                         begin++;
151                         end--;
152                 }
153         
154                 //"\82Ì\83G\83X\83P\81[\83v\8f\88\97\9d
155                 //\8cã\82ë\82©\82ç\8c©\82Ä\82¢\82Á\82Ä"\82ª\82 \82ê\82Î\83R\83s\81[\82·\82é
156                 m_buffer[end+1] = '\0';
157                 for(int tmp = end ; begin < tmp ; tmp--){
158                         if(m_buffer[tmp] == '"'){
159                                 memmove(m_buffer + tmp-1 , m_buffer+ tmp , sizeof(TCHAR)*(end-tmp+2));
160                                 tmp--;
161                         }
162
163                 }
164                 m_pBufferedValue = m_buffer + begin;
165                 return true;
166         }
167         else {
168                 //\83G\83\89\81[(\8e\9f\82Ì,\82Ü\82Å\93Ç\82Ý\90i\82ß\82é) m_buffer\82Ì\96\96\94ö\82Í\83k\83\8b\95\8e\9a\82È\82Ì\82Å\95K\82¸\92â\8e~\82·\82é
169                 while(lastInput != ',' && lastInput != '\0'){
170                         lastInput = m_buffer[++m_topOfBuffer];
171                 }
172                 m_topOfBuffer++;
173                 m_pBufferedValue = "ERROR";
174                 return true;
175         }
176         
177 }