📄 csvfile.cpp
字号:
//--------------------------------------------------
// Desc: CSV File Read & Write
// Copyright (C) 2007 Artsylee
//
//--------------------------------------------------
//--------------------------------------------------
// 描述: 提供一个简单的CSV文件读写模型
// 对CSV文件作一些限制, 以后再改进.
// 1, 值不包含(| '\"' | ',' | ' ' | '\t' |)
// 2, 文件开头无描述行.
// 3, 行尾无逗号(可以有逗号).
// 4, 每个记录的Field数一致.
// 5, 写记录暂时不实现.
//--------------------------------------------------
#include "CSVFile.h"
#include "Common.h"
CSVFile::CSVFile(void)
{
m_Index = 0;
m_FieldNum = 0;
}
CSVFile::CSVFile(const char *pFileName)
{
m_Index = 0;
m_FieldNum = 0;
Open(pFileName);
}
CSVFile::~CSVFile(void)
{
m_Datamap.clear();
}
//--------------------------------------------------
// 打开CSV文件
//--------------------------------------------------
bool CSVFile::Open(const char *pFileName)
{
if(pFileName==NULL)
{
WriteLog(INFO_ERROR, "pFileName=NULL! [CSVFile::Open]");
return false;
}
strcpy(m_FileName, pFileName);
FILE *fp;
fp=fopen(pFileName, "rb");
if(fp==NULL)
{
WriteLog(INFO_ERROR, "Can't open CSV file [%s] !",pFileName);
return false;
}
m_Datamap.clear();
m_Index = 0;
char szTemp[1024];
size_t length;
while(fgets(szTemp, 1024, fp))
{
length = strlen(szTemp);
if(length<=2)
continue;
if(szTemp[length-1] == '\n')
{
szTemp[length-1] = '\0';
}
if(szTemp[length-2] == '\r')
{
szTemp[length-2] = '\0';
}
m_Datamap[m_Index] = string(szTemp);
m_Index++;
}
fclose(fp);
if(m_Index>0)
{
strcpy(szTemp, m_Datamap[0].c_str());
int field = 0;
for(size_t i=0; i<strlen(szTemp); i++)
{
if(szTemp[i] == ',')
{
field++;
}
}
// 此处可能有问题
if(szTemp[strlen(szTemp)-1] == ',')
{
m_FieldNum = field+1;
}
else
{
m_FieldNum = field+1;
}
}
//--------------------------------------------------
// TEST
//--------------------------------------------------
return true;
}
bool CSVFile::Save(const char *pFileName/* =NULL */)
{
return true;
}
size_t CSVFile::GetRecordCount(void)
{
return m_Index;
}
size_t CSVFile::GetFieldCount(void)
{
return m_FieldNum;
}
//--------------------------------------------------
// 根据行数获取记录字符串
//--------------------------------------------------
char* CSVFile::ReadRecord(size_t recordindex, char *pBuffer)
{
if(pBuffer == NULL) return NULL;
if(recordindex>=m_Index)
{
pBuffer[0] = '\0';
return NULL;
}
strcpy(pBuffer, m_Datamap[recordindex].c_str());
return pBuffer;
}
//--------------------------------------------------
// 根据某列上指定值(整型)获取从recordindex开始的第N
// 条记录的行数(为-1代表无匹配值)
//--------------------------------------------------
int CSVFile::GetRecordIndex(size_t recordindex, size_t fieldindex, int value, int counter /* = 0 */)
{
if(recordindex>=m_Index)
{
return -1;
}
if(fieldindex>=m_FieldNum)
{
return -1;
}
int num = 0;
for(size_t i=recordindex; i<m_Index; i++)
{
// 尽量使value的值与默认返回值不等
if(ReadInt32(i, fieldindex, -999999) == value)
{
if(num==counter)
return (int)(i);
else
num++;
}
}
return -1;
}
//--------------------------------------------------
// 根据某列上指定值(字符型)获取从recordindex开始的第
// N条记录的行数(为-1代表无匹配值)
//--------------------------------------------------
int CSVFile::GetRecordIndex(size_t recordindex, size_t fieldindex, const char *pValue, int counter /* = 0 */)
{
if(recordindex>=m_Index)
{
return -1;
}
if(fieldindex>=m_FieldNum)
{
return -1;
}
char szTemp[256];
int num = 0;
for(size_t i=recordindex; i<m_Index; i++)
{
// 尽量使value的值与默认返回值不等
if(ReadString(i, fieldindex, szTemp, "artsylee is good"))
{
if(strcmp(szTemp, pValue)==0)
{
if(num==counter)
return (int)(i);
else
num++;
}
}
}
return -1;
}
//--------------------------------------------------
// 根据某列上指定值获取相同值的记录数
// 没有则返回0
//--------------------------------------------------
int CSVFile::GetRecordNumber(size_t fieldindex, int value)
{
int number = 0;
if(fieldindex>=m_FieldNum)
{
return number;
}
for(size_t i=0; i<m_Index; i++)
{
// 尽量使value的值与默认返回值不等
if(ReadInt32(i, fieldindex, -969696) == value)
{
number++;
}
}
return number;
}
//--------------------------------------------------
// 根据某列上指定值获取相同值的记录数
// 没有则返回0
//--------------------------------------------------
int CSVFile::GetRecordNumber(size_t fieldindex, const char *pValue)
{
int number = 0;
if(fieldindex>=m_FieldNum)
{
return number;
}
char szTemp[256];
for(size_t i=0; i<m_Index; i++)
{
// 尽量使value的值与默认返回值不等
if(ReadString(i, fieldindex, szTemp, "artsylee is good"))
{
if(strcmp(szTemp, pValue)==0)
number++;
}
}
return number;
}
//--------------------------------------------------
// 获取指定位置的32位整数
//--------------------------------------------------
int CSVFile::ReadInt32(size_t recordindex, size_t fieldindex, int value /* = 0 */)
{
char szTemp[256];
if(ReadString(recordindex, fieldindex, szTemp))
{
char *p = NULL;
return atoi(szTemp);
}
return value;
}
//--------------------------------------------------
// 获取指定位置的32位无符号数
//--------------------------------------------------
unsigned CSVFile::ReadUint32(size_t recordindex, size_t fieldindex, unsigned value /* = 0 */)
{
char szTemp[256];
if(ReadString(recordindex, fieldindex, szTemp))
{
char *p = NULL;
return (unsigned)strtoul(szTemp, 0, 0);
}
return value;
}
//--------------------------------------------------
// 获取指定位置的浮点数
//--------------------------------------------------
float CSVFile::ReadFloat(size_t recordindex, size_t fieldindex, float value /* = 0.0f */)
{
char szTemp[256];
if(ReadString(recordindex, fieldindex, szTemp))
{
char *p = NULL;
return (float)strtod(szTemp, &p);
}
return value;
}
//--------------------------------------------------
// 获取指定位置的字符串
//--------------------------------------------------
bool CSVFile::ReadString(size_t recordindex, size_t fieldindex, char *pBuf, const char *pDefault /* = "" */)
{
if(pBuf == NULL) return false;
if(recordindex>=m_Index)
{
strcpy(pBuf, pDefault);
return false;
}
if(fieldindex>=m_FieldNum)
{
strcpy(pBuf, pDefault);
return false;
}
if(!GetSubString(m_Datamap[recordindex].c_str(), pBuf, fieldindex))
{
strcpy(pBuf, pDefault);
return false;
}
return true;
}
//--------------------------------------------------
// 获取字符串的子串
//--------------------------------------------------
bool CSVFile::GetSubString(const char *pString, char *pResult, size_t field)
{
if(pString==NULL || pResult == NULL)
return false;
size_t token = 0;
for(size_t i=0; i<strlen(pString); i++)
{
if(token == field)
{
int resnum = 0;
while(pString[i] != ',' && i<strlen(pString))
{
pResult[resnum] = pString[i];
resnum++;
i++;
}
pResult[resnum] = 0;
return true;
}
else if(pString[i] == ',')
{
token++;
}
}
pResult[0] = 0;
return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -