1 #include "mof/CSVFile.h"
4 #include "mof/ConsoleIO.h"
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;
14 m_pBufferedValue = NULL;
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;
28 m_pBufferedValue = NULL;
35 mof::CSVFile::~CSVFile(){
40 bool mof::CSVFile::hasNextValue(){
41 if(m_hasBufferedValue)return true;//Value
\82Ì
\83o
\83b
\83t
\83@
\82ª
\82 \82é
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©
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;
52 return m_pBufferedValue != NULL;
54 //if(m_topOfBuffer == m_bufferSize)
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;
65 //
\8e\9f\82Ì
\92l
\82ª
\82È
\82¢
\8fê
\8d\87
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;
80 void mof::CSVFile::setIgnoreNL(bool ignore){
86 bool mof::CSVFile::updateNextValue(){
88 if(m_topOfBuffer == m_bufferSize){
90 m_pBufferedValue = NULL;
91 m_hasBufferedValue = false;
96 ISPACE , ICOMMA , IQUOTE , IWORD , IEOF
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
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}
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é
120 if( m_buffer[m_topOfBuffer] == '\0'){
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];
129 m_hasBufferedValue = true;
133 m_pBufferedValue = NULL;
134 m_topOfBuffer = m_bufferSize;
135 m_hasBufferedValue = false;
138 else if(state == _EMP){
139 m_pBufferedValue = "";
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--;
149 //
\97¼
\92[
\82Ì
\81h
\82ð
\8f\9c\8b\8e
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));
164 m_pBufferedValue = m_buffer + begin;
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];
173 m_pBufferedValue = "ERROR";