您的位置:首页 > 其它

简易csv解析

2016-02-29 10:38 204 查看

游戏开发中少不了配置数据,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;
};
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: