微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在cocos2dx中解析CSV文件

本文主要是用C++简单的实现了cocos2dx中对CSV文件的解析,由于能力有限,写的不好的地方提出来共同学习共同进步,

这里参考了笨木头使用LUA解析CSV文件点击打开链接还参考了另一位仁兄的C++代码,网址找不到了,真是抱歉

首先需要补充一点概念:什么是CSV文件??

就是一行为一条记录,每条记录以","作为分隔符啦划分字段(哈,详细内容请自行百度~~~)

ID,NAME,SEX,YEAR,REMARKET
1,张三,男,34,好好学习,天天向上
2,李四,女,25,你是谁啊你是谁

对CSV文件的解析,说简单一点就是对字符串的分割,下面说说我的字符串分割函数split

//字符串分割函数
void split(const std::string &str,const char *reps,std::vector<std::string> &tarVector)
{
	std::string tarString(str);
	while (!tarString.empty()) {
		int pos = tarString.find_first_of(reps);
		if (pos == std::string::npos) {
			tarVector.push_back(tarString);
			tarString.clear();
		}
		else {
			tarVector.push_back(tarString.substr(0,pos));
			tarString.erase(0,pos + strlen(reps));
		}
	}
}

代码还是比较好理解的,大体思路就是从字符串首开始搜索到分隔符(子串),然后提取出来,并删除子串和分隔符,直至结束


下面看头文件

#ifndef __CSV_PARSER_H__
#define __CSV_PARSER_H__

#include "cocos2d.h"

class Linestring
{
public:
	Linestring(const std::string &str);
	virtual ~Linestring();

	size_t getColumnCount() const { return _linestr.size(); }

	std::string &operator[](size_t index)
	{
		CCASSERT(index < this->getColumnCount(),"invalid index in lineInfo");
		return _linestr[index];
	}

protected:
	void initWithString(const std::string &str);

private:
	std::vector<std::string> _linestr;
};

class CsvParser
{
public:
	CsvParser();
	virtual ~CsvParser();

	void parseWithFile(const std::string &csvFilename);

	size_t getRowCount() const { return _dataInfo.size(); }
	size_t getColumnCount() const { return _titles.size(); }

	Linestring &operator[](size_t index)
	{
		CCASSERT(index < this->getColumnCount(),"invalid index in lineInfo");
		return _dataInfo[index];
	}

private:
	std::vector<std::string> _titles;
	std::vector<Linestring> _dataInfo;
};
#endif // __CSV_PARSER_H__


文件中定义了两个类,一个是用于行信息管理的Linestrng类,并重载了[]运算符,另一个才是真正的解析CSV文件的类CsvParser,函数都比较简单

下面看具体的实现:


#include "CsvParser.h"

USING_NS_CC;

//字符串分割函数
void split(const std::string &str,pos + strlen(reps));
		}
	}
}

Linestring::Linestring(const std::string &str)
{
	this->initWithString(str);
}

Linestring::~Linestring()
{

}

void Linestring::initWithString(const std::string &str)
{
	split(str,",_linestr);
}

//////////////////////////////////////////////////////////////////////////
CsvParser::CsvParser()
{

}

CsvParser::~CsvParser()
{

}

void CsvParser::parseWithFile(const std::string &csvFilename)
{
	std::string fullPth = FileUtils::getInstance()->fullPathForFilename(csvFilename);
	std::string tokenStr = FileUtils::getInstance()->getStringFromFile(fullPth);

	//获取行信息
	std::vector<std::string> lineInfo;
	split(tokenStr,"\n\r",lineInfo);

	//得到标题
	split(lineInfo[0],_titles);

	//获取具体内容
	size_t rowCount = lineInfo.size();
	for (int i = 1; i < rowCount; i++) {
		Linestring linestr(lineInfo[i]);
		_dataInfo.push_back(linestr);
	}
}


需要注意的是我的文件读取是直接使用的cocos中的FilUtils类的std::string tokenStr = FileUtils::getInstance()->getStringFromFile(fullPth);有兴趣的可以自己去扒一扒源代码,你也可以使用其他的方式去读取获得,正所谓条条大道通罗马~~~~

使用起来也就很简单了:

	CsvParser csv;
	csv.parseWithFile("csvTest.csv");

	for (int i = 0; i < csv.getRowCount(); i++) {
		for (int j = 0; j < csv.getColumnCount(); j++) {
			log("%s",csv[i][j].c_str());
		}
	}


看看打印出来什么。。。。

第一次写blog,好紧张,隔壁的回来了,有点吵吵的,这篇文章就到这里吧,有点犯困了。。。。






版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


    本文实践自 RayWenderlich、Ali Hafizji 的文章《How To Create Dynamic Textures with CCRenderTexture in Cocos2D 2.X》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.1.4进行学习和移植。在这篇文章,将会学习到如何创建实时纹理、如何用Gimp创建无缝拼接纹
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@163.com微信公众号:HopToad 欢迎转载,转载标注出处:http://blog.csdn.netotbaron/article/details/424343991.  软件准备 下载地址:http://cn.cocos2d-x.org/download 2.  简介2.1         引用C
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从Cocos2D-x官网上下载,进入网页http://www.cocos2d-x.org/download,点击Cocos2d-x以下的Download  v3.0,保存到自定义的文件夹2:从python官网上下载。进入网页https://www.python.org/downloads/,我当前下载的是3.4.0(当前最新
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发引擎,易学易用,支持多种智能移动平台。官网地址:http://cocos2d-x.org/当前版本:2.0    有很多的学习资料,在这里我只做为自己的笔记记录下来,错误之处还请指出。在VisualStudio2008平台的编译:1.下载当前稳
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《最强大脑》娱乐节目。将2048改造成一款挑战玩家对数字记忆的小游戏。邮箱:appdevzw@163.com微信公众号:HopToadAPK下载地址:http://download.csdn.net/detailotbaron/8446223源码下载地址:http://download.csdn.net/
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试以QtCreatorIDE来进行CMake构建。Cocos2d-x3.X地址:https://github.com/cocos2d/cocos2d-x1.打开QtCreator,菜单栏→"打开文件或项目...",打开cocos2d-x目录下的CMakeLists.txt文件;2.弹出CMake向导,如下图所示:设置
 下载地址:链接:https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ提取码:p1pb下载完成后,解压进入build目录使用vs2013打开工程设置平台工具集,打开设置界面设置: 点击开始编译等待编译结束编译成功在build文件下会出现一个新文件夹Debug.win32,里面就是编译
分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net前言上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实
1. 圆形音量button事实上作者的本意应该是叫做“电位计button”。可是我觉得它和我们的圆形音量button非常像,所以就这么叫它吧~先看效果:好了,不多解释,本篇到此为止。(旁白: 噗。就这样结束了?)啊才怪~我们来看看代码:[cpp] viewplaincopyprint?CCContro
原文链接:http://www.cnblogs.com/physwf/archive/2013/04/26/3043912.html为了进一步深入学习贯彻Cocos2d,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建