首页 > 代码库 > [cocos2dx utils] cocos2dx读取,解析csv文件
[cocos2dx utils] cocos2dx读取,解析csv文件
在我们的游戏中,经常需要将策划的数值配置成csv文件,所以解析csv文件就是一个很common的logic,
例如如下csv文件:
下面是一个基于cocos2dx 2.2.4的实现类:
#ifndef __Cell__GCCsvHelper__#define __Cell__GCCsvHelper__#include <iostream>#include "cocos2d.h"#include <vector>USING_NS_CC;class GCCsvHelper{public: GCCsvHelper(); ~GCCsvHelper(); bool openAndResolveFile(const char *fileName); const char *getData(unsigned int rowIndex, unsigned int colIndex); inline int getColLength() { return m_colLength; } inline int getRowLength() { return data.size(); }private: const std::string m_seperator; std::vector<std::vector<std::string> > data; //cols length int m_colLength; void rowSplit(std::vector<std::string> &rows, const std::string &content, const char &rowSeperator); void fieldSplit(std::vector<std::string> &fields, std::string line); //获取带引号的字段 int getFieldWithQuoted(const std::string &line, std::string& field, int index); //获取无引号的字段 int getFieldNoQuoted(const std::string &line, std::string &field, int index);};#endif /* defined(__Cell__GCCsvHelper__) */
#include "GCCsvHelper.h"GCCsvHelper::GCCsvHelper():m_seperator(","),m_colLength(0){ }GCCsvHelper::~GCCsvHelper(){ }#pragma region reselove the content begin...bool GCCsvHelper::openAndResolveFile(const char *fileName){ std::string pathKey = CCFileUtils::sharedFileUtils()->fullPathForFilename(fileName); unsigned char* pBuffer = NULL; unsigned long bufferSize = 0; pBuffer = CCFileUtils::sharedFileUtils()->getFileData(pathKey.c_str(), "r", &bufferSize); std::string tmpStr = (char*)pBuffer; std::string fileContent = tmpStr.substr(0, bufferSize); std::vector<std::string> line; rowSplit(line, fileContent, ‘\n‘); for (unsigned int i = 0; i < line.size(); ++i) { std::vector<std::string> fieldVector; fieldSplit(fieldVector, line[i]); data.push_back(fieldVector); m_colLength = std::max(m_colLength, (int)fieldVector.size()); } return true;}void GCCsvHelper::rowSplit(std::vector<std::string> &rows, const std::string &content, const char &rowSeperator){ std::string::size_type lastIndex = content.find_first_not_of(rowSeperator, 0); std::string::size_type currentIndex = content.find_first_of(rowSeperator,lastIndex); while (std::string::npos != currentIndex || std::string::npos != lastIndex) { rows.push_back(content.substr(lastIndex, currentIndex - lastIndex)); lastIndex = content.find_first_not_of(rowSeperator, currentIndex); currentIndex = content.find_first_of(rowSeperator, lastIndex); }}void GCCsvHelper::fieldSplit(std::vector<std::string> &fields, std::string line){ if (line[line.length() - 1] == ‘\r‘) { line = line.substr(0, line.length() - 1); } std::string field; unsigned int i = 0, j = 0; while (j < line.length()) { if (line[i] == ‘"‘) { //有引号 j = getFieldWithQuoted(line, field, i); } else { j = getFieldNoQuoted(line, field, i); } fields.push_back(field); i = j + 1; //解析下一个field, +1为了跳过当前的分隔符 }}int GCCsvHelper::getFieldWithQuoted(const std::string &line, std::string &field, int i){ unsigned int j = 0; field = std::string(); if (line[i] != ‘"‘) { //不是引号起始,有问题 CCLOGERROR("start char is not quote when call %s", __FUNCTION__); return -1; } for (j = i + 1; j < line.length() - 1; ++j) { if (line[j] != ‘"‘) { //当前char不为引号,则是field内容(包括逗号) field += line[j]; } else { //遇到field结束时的引号,可以返回 return j; break; } } if (j == line.length()) { //没有找到成对的结束引号 CCLOGERROR("resoleve the line error: no pair quote, line:%s, field:%s, start index:%d", line.c_str(), field.c_str(), i); } return j;}int GCCsvHelper::getFieldNoQuoted(const std::string &line, std::string &field, int index){ unsigned int j = 0; //找到下一个分隔符位置 j = line.find_first_of(m_seperator, index); if (j > line.length()) { j = line.length(); } field = std::string(line, index, j - index); return j;}#pragma region end.///////search dataconst char *GCCsvHelper::getData(unsigned int rowIndex, unsigned int colIndex){ if (rowIndex >= getRowLength() || colIndex >= getColLength()) { return ""; } if (colIndex >= data[rowIndex].size()) { return ""; } return data[rowIndex][colIndex].c_str();}
Test Case:
void CsvHelperTesterScene::onEnter(){ CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize(); GCCsvHelper *csv = new GCCsvHelper(); csv->openAndResolveFile("test.csv"); std::string line = ""; for (int i = 0; i < csv->getRowLength(); ++i) { for (int j = 0; j < csv->getColLength(); ++j) { line += csv->getData(i, j); line += ";"; } CCLabelTTF *pLbl = CCLabelTTF::create(line.c_str(), "Arial", 20); pLbl->setColor(ccc3(255, 250, 250)); pLbl->setPosition(ccp(visibleSize.width / 2, visibleSize.height - 200 - i * 30)); addChild(pLbl); line = ""; } delete csv;}
测试结果:
[cocos2dx utils] cocos2dx读取,解析csv文件
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。