简易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; }; }
相关文章推荐
- linux vi保存退出命令 (如何退出vi)
- 做开发的目的是为了什么
- sql server 日期转换
- sql server 日期
- [转] berkeley db aosa阅读
- VB.net 播放 WAV音乐
- Java中的双重检查(Double-Check)详解
- UISwitch控件修改大小。设置颜色
- 携程App的网络性能优化实践
- Android自定义ViewGroup之子控件的自动换行和添加删除
- 数据库索引及基本优化
- 将函数的实际参数转换成数组的方法
- vim编辑器使用
- MFC CEdit获取编辑框内容
- 梯度、梯度下降,随机梯度下降
- 在Unity3D中基于订阅者模式实现事件机制
- Django model.py表单的默认值 默认允许为空
- UIKit框架(6)控制器view的加载方式
- binder驱动-------之内存映射篇
- 2月份Web服务器份额:排名不变 仅Microsoft份额上扬