|
#include <string.h> #include <stdio.h>
class CCSVReader { public : CCSVReader(); ~CCSVReader();
bool Load(const char *fname);
int GetData(int col, int row, char * outptr, int outlen) ;
private : char * m_pBuffer; int * m_pOffset; int m_iLine;
int CountLine(const char *buffer, int * offset); int PassToken(const char * str); char * ReadFile(const char *fname); } ;
CCSVReader :: CCSVReader() { m_pBuffer = NULL; m_pOffset = NULL; m_iLine = 0; }
CCSVReader :: ~CCSVReader() { if (m_pBuffer) delete [] m_pBuffer; if (m_pOffset) delete [] m_pOffset; }
char * CCSVReader :: ReadFile(const char *fname) { FILE *fp; char * ptr; int len;
fp = fopen(fname, "rb"); if (fp == NULL) return NULL; fseek(fp, 0, SEEK_END); len = ftell(fp); fseek(fp, 0, SEEK_SET); ptr = new char [len+1]; fread(ptr, 1, len, fp); ptr[len] = '\0'; fclose(fp);
return ptr; }
bool CCSVReader :: Load(const char *fname) { // 파일 전체를 읽는다 // m_pBuffer = ReadFile(fname);
// 라인수를 센 후 각 오프셋을 구한다 // m_iLine = CountLine(m_pBuffer, NULL); m_pOffset = new int [m_iLine]; CountLine(m_pBuffer, m_pOffset);
return true; }
int CCSVReader :: CountLine(const char *buffer, int * offset) { const char * p = buffer; int line;
for(line=0; p; line++) { if (line > 0) p++;
if (offset) offset[line] = (int)(p - buffer);
p = strchr(p, '\n'); }
return line; }
int CCSVReader :: PassToken(const char * str) { int i = 0;
if (str[0] == '\"') { for(i=1; ;) { if (str[i] == '\"') { if (str[i+1] == '\"') i += 2; else break; } else i += 1; } return i+1; } else { for(i=0; !strchr(",\n", str[i]); i++) ; return i; } }
int CCSVReader :: GetData(int col, int row, char * outptr, int outlen) { int i, off;
if (row >= m_iLine) return 0;
for(i=0, off=m_pOffset[row]; i<col; off++, i++) { off += PassToken(m_pBuffer + off); if (strchr("\n", m_pBuffer[off])) { outptr[0] = '\0'; return 0; } }
if (m_pBuffer[off] == '\"') { for(i=0, off+=1; ; i++) { if (m_pBuffer[off] == '\"' && m_pBuffer[off+1] == '\"') { if (i < outlen-1) outptr[i] = m_pBuffer[off]; off += 2; } else if (m_pBuffer[off] != '\"') { outptr[i] = m_pBuffer[off]; off += 1; } else break; } } else { for(i=0; !strchr(",\n", m_pBuffer[off]); i++, off++) { if (i < outlen-1) outptr[i] = m_pBuffer[off]; } }
if (i >= outlen-1) outptr[outlen-1] = '\0'; else outptr[i] = '\0'; return i; }
#include <stdlib.h>
void main() { CCSVReader reader; char data[32]; int t = 0; reader.Load("Book1.csv"); while(t++ < 10000) { reader.GetData(rand()%100, rand()%100, data, (rand()%(sizeof(data)/2) + sizeof(data)/2)); // 별의미없음 ^^ } }
|
댓글을 달아 주세요
csv에서 ,가 내용중에 실수로 들어가거나,
뒤쪽으로 ,,,,,,,,, 이런게 붙게 되었을때의
예외처리 같은것도 필요하더라구요^-^
,가 내용중에 있을 경우 따옴표로 감싸줘서 괜찮았던거 같은데(내용처럼), 한번 확인해봐야 겠네요.
엑셀에서 작업해도 ,가 내용에 들어가면 ""가 감싸는군요 ^^;
""로 감싸져있는 부분을 예외처리 하니까 원활하게 돌아가는군요~
읔; 짧은 지식이 누가 됐네요^^;
근데.. 엑셀에서는 csv에 유니코드를 지원을 안해욤.. ㅜ _-
그래서 우리는 쉼표가 아닌 tab으로 구분하는 csv로 변경했스빈다.
( tab으로 구분하는 녀석은 유니코드 지원을 해욤.. )
친구는 너의 위치의 현재 팬이 되었다!