TNB Library
TnbTinyCsvReader.h
[詳解]
1#pragma once
14#include "TnbBlocklinkVector.h"
15#include "TnbFile.h"
16#include "TnbStrVector.h"
17
18
19
20//TNB Library
21namespace TNB
22{
23
24
25
34{
35public:
36
43 bool ReadCsv(LPCTSTR lpszFileName)
44 {
45 m_content.RemoveAll();
46 CByteVector vb;
47 if ( CFileReader::ReadAll(vb, lpszFileName) )
48 {
49 vb.Add(0); //終端
50 LPCSTR lpsz = reinterpret_cast<LPCSTR>(vb.ReferBuffer());
51 m_content = m_SeparateLine(lpsz);
52 return true;
53 }
54 return false;
55 }
56
61 size_t GetLineCount(void) const
62 {
63 return m_content.GetSize();
64 }
65
73 CVectorT<int> Get(INDEX line, int emptyValue) const
74 {
76 if ( m_content.GetSize() > line )
77 {
78 LPCSTR lpsz = m_content[line].ReferBuffer();
79 int s;
80 if ( lpsz[0] != 0 )
81 {
82 while ( true )
83 {
84 INT_PTR r = m_FindComma(lpsz);
85 if ( r < 0 )
86 {
87 s = (*lpsz == 0) ? emptyValue : ::atoi(lpsz);
88 }
89 else if ( r == 0 )
90 {
91 s = emptyValue;
92 lpsz++;
93 }
94 else
95 {
96 s = ::atoi(lpsz);
97 lpsz += r + 1;
98 }
99 vs.Add(s);
100 if ( r < 0 )
101 {
102 break;
103 }
104 }
105 }
106 }
108 v.Copy(vs);
109 return v;
110 }
111
119 CVectorT<double> Get(INDEX line, double emptyValue) const
120 {
122 if ( m_content.GetSize() > line )
123 {
124 LPCSTR lpsz = m_content[line].ReferBuffer();
125 double s;
126 if ( lpsz[0] != 0 )
127 {
128 while ( true )
129 {
130 INT_PTR r = m_FindComma(lpsz);
131 if ( r < 0 )
132 {
133 s = (*lpsz == 0) ? emptyValue : ::atof(lpsz);
134 }
135 else if ( r == 0 )
136 {
137 s = emptyValue;
138 lpsz++;
139 }
140 else
141 {
142 s = ::atof(lpsz);
143 lpsz += r + 1;
144 }
145 vs.Add(s);
146 if ( r < 0 )
147 {
148 break;
149 }
150 }
151 }
152 }
154 v.Copy(vs);
155 return v;
156 }
157
158private:
159
168 inline const char* m_FindCr(const char* lpsz) const
169 {
170 while ( *lpsz != 0 )
171 {
172 if ( *lpsz == 0x0D )
173 {
174 return lpsz;
175 }
176 lpsz ++;
177 }
178 return NULL;
179 }
180
189 inline INT_PTR m_FindComma(const char* lpsz) const
190 {
191 INT_PTR r = 0;
192 while ( *lpsz != 0 )
193 {
194 if ( *lpsz == ',' )
195 {
196 return r;
197 }
198 lpsz++;
199 r++;
200 }
201 return -1;
202 }
203
211 const char* m_GetLine(CStrT<char>& _strLine, const char* lpsz)
212 {
213 _strLine.Empty();
214 const char* P = NULL;
215 P = m_FindCr(lpsz);
216 if ( P == NULL )
217 {
218 //見つからなかった。全部が一行
219 _strLine = lpsz;
220 }
221 else
222 {
223 INT_PTR iLen = P - lpsz;
224 if ( iLen > 0 )
225 {
226 char* Q = _strLine.GetBuffer(iLen);
227 memcpy(Q, lpsz, iLen);
228 Q[iLen] = 0;
229 _strLine.ReleaseBuffer();
230 }
231 if ( *P++ == 0x0D )
232 {
233 if ( *P == 0x0A )
234 {
235 P++;
236 }
237 }
238 }
239 return P;
240 }
241
247 CVectorT<CStrT<char> > m_SeparateLine(const char* lpsz)
248 {
250 CStrT<char> s;
251 const char* P = lpsz;
252 while ( P != NULL )
253 {
254 P = m_GetLine(s, P);
255 vs.Add(s);
256 }
258 v.Copy(vs);
259 return v;
260 }
261
262 CStrVector m_content;
263};
264
265
266
267}; // TNB
ファイル関係のヘッダ
文字列情報配列管理関係のヘッダ
配列型情報管理テンプレート
virtual INDEX Add(const TYP &t)
[追加] 要素一つ追加.
static bool ReadAll(CByteVector &_content, LPCTSTR lpszFileName, CFileReader &fr=CFileReader())
[取得] ファイル全読み込み.
Definition: TnbFile.h:434
void ReleaseBuffer(void)
[操作] 割り当てたバッファを開放.
Definition: TnbStr.h:954
void Empty(void)
[削除] 空化
Definition: TnbStr.h:197
TYP * GetBuffer(size_t iLength=0)
[操作] 書き込みバッファ要求.
Definition: TnbStr.h:914
簡易CSVファイル読み込みクラス.
size_t GetLineCount(void) const
[取得] 行数取得.
CVectorT< int > Get(INDEX line, int emptyValue) const
[取得] データ取得
bool ReadCsv(LPCTSTR lpszFileName)
[読込] CSV読み込み.
CVectorT< double > Get(INDEX line, double emptyValue) const
[取得] データ取得
virtual size_t GetSize(void) const
[取得] サイズ取得
Definition: TnbVector.h:368
virtual bool RemoveAll(void)
[削除] 空化
Definition: TnbVector.h:565
virtual const TYP * ReferBuffer(void) const
[取得] データアドレス取得
Definition: TnbVector.h:664
virtual INDEX Add(const TYP &t)
[追加] 要素一つ追加.
Definition: TnbVector.h:383
TNB Library
Definition: TnbDoxyTitle.txt:2
virtual size_t Copy(const IConstCollectionT< TYP > &c)
[設定] コピー.