
#ifndef _PARSE_CSV_H_#define _PARSE_CSV_H_#include <fstream>#include <sstream>#include <map>#include <List>#include <vector>using namespace std;struct CsvData{ string filename; map< string,map< string,string > > TabData; CsvData() { filename = ""; TabData.clear(); } string GetData( string key,string head ) {//获取数据 return TabData[key][head]; } voID PushData( string key,string > data ) {//压入数据 TabData[key] = data;//保存整行的数据 } voID Setfilename( string filename ) {//设置文件名 filename = filename; }};class ParseCsv{private: static ParseCsv* m_pThis;public: /** * @brIEf 单例 */ static ParseCsv* Instance() { if (!m_pThis) { m_pThis = new ParseCsv(); } return m_pThis; } /** * @brIEf 构造函数 */ ParseCsv(voID); /** * @brIEf 析构函数 */ ~ParseCsv(voID); /** * @brIEf 加载CSV文件 */ bool LoadCsv( const char* filename,const char* filePath ) { return _loadCsv( filename,filePath ); } /** * @brIEf 获取数据 */ string GetData( string filename,string key,string head ); string GetData( string filename,int key,string head ); /** @brIEf 分割字符串 */ vector<string> SplitString( const string &strContext,string strSpilt );private: bool _loadCsv( const char* filename,const char* filePath );private: map< string,CsvData > m_AllDatas;};#endif <pre name="code" >#include "ParseCsv.h"#include "extensions\cocos-ext.h"#include "cocos2d.h"USING_NS_CC;ParseCsv *ParseCsv::m_pThis = NulL;ParseCsv::ParseCsv(voID){ m_AllDatas.clear();}ParseCsv::~ParseCsv(voID){}bool ParseCsv::_loadCsv( const char* filename,const char* filePath ){//加载CSV文件 //调用cocos2dx工具类读出数据 string path = fileUtils::getInstance()->fullPathForfilename( filePath ); ssize_t bufferSize = 0; char* buf = (char*)fileUtils::getInstance()->getfileData(path.c_str(),"r",&bufferSize); ssize_t size = bufferSize; //新建Csv结构体 CsvData data; data.Setfilename(filename); //把整个表按行分割 string strbuff; ssize_t count = 0; do { if( count >= size ) break; strbuff += buf[ count++ ]; }while( true ); vector<string> vecTab = this->SplitString( strbuff,"\r\n" ); //读取表头 vector<string>::iterator iterTab = vecTab.begin(); if ( iterTab == vecTab.end() ) return false; vector<string> vecheadline = this->SplitString( *iterTab,"\t" ); List<string> head;//表头 for (vector<string>::iterator iterline = vecheadline.begin(); iterline != vecheadline.end(); iterline++) { head.push_back( *iterline ); } //每行按"\t"分割 读出所有数据 iterTab++; for ( ; iterTab != vecTab.end(); iterTab++ ) {//读取表里数据 map<string,string> tabline; vector<string> vecline = this->SplitString( *iterTab,"\t" ); List<string>::iterator iterhead = head.begin(); vector<string>::iterator iterline = vecline.begin(); for ( ; iterline != vecline.end(); iterline++ ) { tabline[*iterhead] = *iterline; iterhead++; if ( iterhead == head.end() ) break; } data.PushData( tabline[*head.begin()],tabline ); } m_AllDatas[filename] = data; return true;}string ParseCsv::GetData( string filename,string head ){//获取数据 return m_AllDatas[filename].GetData( key,head );}string ParseCsv::GetData( string filename,string head ){//获取数据 char sz[32] = {0}; sprintf( sz,"%d",key ); return this->GetData( filename,sz,head );}vector<string> ParseCsv::SplitString( const string &strContext,string strSpilt ){//分割字符串 vector<string> vecStr; int charLen = strSpilt.size();//分隔符的长度 int lastPos = 0; int index = -1; while ( -1 != ( index = strContext.find( strSpilt,lastPos ) ) ) { vecStr.push_back( strContext.substr( lastPos,index - lastPos ) ); lastPos = index + charLen; } string lastString = strContext.substr( lastPos );//截取最后一个分隔符后的内容 if ( !lastString.empty() ) {//不为空也压进去 vecStr.push_back( lastString ); } return vecStr;} 复制去Google翻译 翻译结果 总结
以上是内存溢出为你收集整理的cocos2dx 3.x 读取csv全部内容,希望文章能够帮你解决cocos2dx 3.x 读取csv所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)