游戏开发中少不了配置数据,csv格式既方便导出又方便使用,下面是简单csv解析(字段数据中不能含有分隔符),以后会继续完善,嘿嘿。
//
// CCSVParse.hpp
// CPPAlgorithm
//
// Created by xujw on 16/2/26.
// Copyright © 2016年 xujw. All rights reserved.
//
#ifndef CCSVParse_h
#define CCSVParse_h
#include <stdio.h>
#include <vector>
#include <string>
#include <iostream>
class CCSVParse
{
public:
CCSVParse();
~CCSVParse();
//解析出行列数据
std::vector< std::vector<std::string> > parseCsvFile(const std::string &fileName,const std::string &separator = ",");
//打印出解析的数据 测试用
void printParseData() const;
inline size_t getRowNum() const {return _gridData.size();};
/*
分隔字符串
str:要分隔的字符串/文件
seperator:分隔符
*/
std::vector<std::string> splitString(const std::string &str,const std::string &sparator);
std::string loadCsvFile(const std::string &fileName);
private:
//原始数据
std::vector< std::vector<std::string> > _gridData;
};
#endif /* CCSVParse_h */
//
// CCSVParse.cpp
// CPPAlgorithm
//
// Created by xujw on 16/2/26.
// Copyright © 2016年 xujw. All rights reserved.
//
#include "CCSVParse.h"
CCSVParse::CCSVParse(){}
CCSVParse::~CCSVParse(){}
std::vector<std::string> CCSVParse::splitString(const std::string &str, const std::string &separator)
{
std::vector<std::string> resVec;
if ("" == str)
{
return resVec;
}
//方便截取最后一段数据
std::string dataStr = str + separator;
size_t pos = dataStr.find(separator);
size_t size = dataStr.size();
while (pos != std::string::npos)
{
std::string x = dataStr.substr(0,pos);
resVec.push_back(x);
dataStr = dataStr.substr(pos+1,size);
pos = dataStr.find(separator);
}
return resVec;
}
std::string CCSVParse::loadCsvFile(const std::string &fileName)
{
FILE *pFile = fopen(fileName.c_str(), "rb");
if (0 == pFile)
{
return "";
}
fseek(pFile, 0, SEEK_END); //指针移动到文件结尾
long len = ftell(pFile); //获取文件大小
char *pBuffer = new char[len+1];
fseek(pFile, 0, SEEK_SET); //指针移动到文件开头
fread(pBuffer, 1, len, pFile); //读取文件
fclose(pFile);
//等价于std::string s;s.assign(pBuffer,len);
pBuffer[len] = 0;
std::string strRead(pBuffer,len);
delete [] pBuffer;
return strRead;
}
std::vector<std::vector<std::string>> CCSVParse::parseCsvFile(const std::string &fileName,const std::string &separator)
{
clock_t before = clock();
_gridData.clear();
std::string allDataStr = loadCsvFile(fileName);
//分出行和字段
std::vector<std::string> ret = splitString(allDataStr, "\n");
for (size_t i=0; i<ret.size(); i++)
{
std::vector<std::string> rowData = splitString(ret.at(i), separator);
_gridData.push_back(rowData);
}
float used = (float)(clock()-before)/CLOCKS_PER_SEC;
std::cout<<"解析此csv花费时间:"<<used<<"S"<<std::endl;
return _gridData;
}
void CCSVParse::printParseData() const
{
std::cout<<"以下是解析的csv数据:"<<std::endl;
for (int row=0; row<_gridData.size(); row++)
{
std::vector<std::string> rowData = _gridData.at(row);
for (int col = 0; col<rowData.size(); col++)
{
std::cout<<rowData.at(col)<<"\t";
}
std::cout<<"\n"<<std::endl;
};
}