cocos2d-x 读取CSV文件,读取本地Excel配置表的方法

//CSVReader.h

#define MAP_LINE std::map<std::string, std::string>			//key为首行字符串, value为此列字符串
#define MAP_CONTENT std::map<int, MAP_LINE>				//key为code, value为一行map
#define VEC_MAP  std::vector<std::pair<std::string, int>>

//csv文件读取器
class CSVReader
{
public:
	CSVReader();
	static CSVReader *getInst();	//获取实例

	//解析csv. fileName:csv文件名,
	void parse(const char *fileName);

	//获取内容map. filename:文件名
	const MAP_CONTENT &getContentMap(std::string filename);
	//获取一行map.filename:文件名, code一行code
	const MAP_LINE &getLineMap(std::string filename, int code);
	//获取某行某列的值
	const std::string  &getByCode(std::string filename, int code, const std::string &key);
private:
	//读取csv的一行.line:一行的内容
	void readCSVLine(const char *line, int index);

	 VEC_MAP m_firstVector;											//第一行的vector
	 MAP_CONTENT m_contentMap;									//内容map
	 std::map<std::string, MAP_CONTENT> m_fileMap;		//文件map

	 static CSVReader *m_inst;		//实例
};

//CSVReader.cpp

CSVReader *CSVReader::m_inst = NULL;

//构造函数
CSVReader::CSVReader()
{
	m_firstVector.clear();
	m_contentMap.clear();
	m_fileMap.clear();
}
//获取实例
CSVReader *CSVReader::getInst()
{
	if(!m_inst)
	{m_inst = new CSVReader();}

	return m_inst;
}

//获取内容map. filename:文件名
const MAP_CONTENT &CSVReader::getContentMap(std::string filename)
{
	return m_fileMap.find(filename)->second;
}
//获取一行map.filename:文件名, code一行code
const MAP_LINE &CSVReader::getLineMap(std::string filename, int code)
{
	return getContentMap(filename).find(code)->second;
}

//获取某行某列的值
const std::string  &CSVReader::getByCode(std::string filename, int code, const std::string &key)
{
	return getLineMap(filename, code).find(key)->second;
}

//解析csv. fileName:csv文件名,
void CSVReader::parse(const char *fileName)
{
	m_contentMap.clear();		//首先进行清理

	std::string path = fileName;
	unsigned long size;
	const char *data = (const char*)(cocos2d::CCFileUtils::sharedFileUtils()->getFileData(path.c_str(),"r" , &size));
	CCAssert(data != NULL, "File is not exist.");
	if (data == NULL)
		return;

	char line[32768];	//一行最多字节数
	const char *src = data;
	if (size == 0)
		size = strlen(src);

	char *pl = line;		//指向line数组的指针
	int index = 0;
	bool skip = false;	//若一行为空,skip则标记为true

	while (data - src < size)
	{
		//读取到一行的末尾
		if (*data == '\n' && !skip)
		{
			*pl = '\0';
			readCSVLine(line, index);
			++index;
			pl = line;
		}
		else if (*data == '\r')
		{}
		else
		{
			//任何一个字段能留空
			if (*data == '"')
				skip = !skip;

			*pl = *data;
			++pl;
		}
		++data;
	}
	*pl = '\0';

	//添加到map
	m_fileMap.insert(std::map<std::string, MAP_CONTENT>::value_type(fileName, m_contentMap));
}

//读取csv的一行.line:一行的内容
void CSVReader::readCSVLine(const char *line, int index)
{
	char value[32768];	//一行最多字节数
	if (*line == '\0')
		return;

	char *pv[32];
	char *tv = value;
	bool skip = false;
	int count = 0;

	*tv = '\0';
	pv[count++] = tv;

	while (*line != '\0')
	{
		if (*line == ',' && !skip)
		{
			*tv = '\0';
			++tv;
			pv[count++] = tv;
		}
		else if (*line == '"')
		{
			skip = !skip;
		}
		else
		{
			*tv = *line;
			++tv;
		}
		++line;
	}
	*tv = '\0';

	//临时数组
	std::vector<std::pair<std::string, int> > tVector;
	for (int i=0; i<count; ++i)
	{tVector.push_back(std::map<std::string, int>::value_type(pv[i], i));}

	//第一行作为key
	if(index == 0)
	{m_firstVector = tVector;}
	//第2行为注释
	else if(index > 1)
	{
		//一行的map
		std::map<string, string> tmp;
		for (int i = 0; i < m_firstVector.size(); i++)
		{tmp.insert(std::map<string, string>::value_type(m_firstVector[i].first, tVector[i].first));}

		m_contentMap.insert(std::map<int, std::map<string, string>>::value_type(atoi(tVector[0].first.c_str()), tmp));
	}
}

//用法如下

bool HelloWorldScene::init()
{
    //////////////////////////////

	CSVReader::getInst()->parse("haha.csv");

	MAP_LINE map_line = CSVReader::getInst()->getLineMap("haha.csv", 1000000);

	MAP_LINE::iterator it = map_line.begin();
	while (it != map_line.end())
	{
		CCLog("key:%s, value:%s", it->first.c_str(), it->second.c_str());
		it++;
	}
}

//csv表格数据如下图

时间: 2024-11-05 11:55:17

cocos2d-x 读取CSV文件,读取本地Excel配置表的方法的相关文章

cocos2d-x学习笔记——Csv文件读取工具

在一个游戏中,通常会有很多怪物,以及怪物的生命值,魔法值等属性数据,这些数据不可能在代码里面写死,一般都会用配置文件来保存,使用时再加载到内存. 我们常用的配置文件是CSV文件,即逗号分隔值(Comma-Separated Values),如下图所示. 今天,我就来介绍一个来读取CSV文件的工具类--MyCsvUtil. 在接受读取CSV文件工具类之前,先介绍一个读取字符串的工具类--StringUtil. //头文件StringUtil.h #ifndef __StringUtil_H_ #d

用程序读取CSV文件的方法

CSV全称 Comma Separated values,是一种用来存储数据的纯文本文件格式,通常用于电子表格或数据库软件.用Excel或者Numbers都可以导出CSV格式的数据. CSV文件的规则 0 开头是不留空,以行为单位.1 可含或不含列名,含列名则居文件第一行. 2 一行数据不垮行,无空行. 3 以半角符号,作分隔符,列为空也要表达其存在. 4 列内容如存在,,则用""包含起来. 5 列内容如存在""则用""""包

Cocos2d-x Lua 读取Csv文件,更方便的使用数据

我的书上或者是我曾经出售的源码里,都有Csv文件的影子. 也许是先入为主吧,我工作那会用的最久的配置文件就是Csv,所以我在很多游戏里都会情不自禁地优先选择它. Csv文件,格式很简单,就是一行一条数据,字段之间用逗号分隔,策划也可以方便地使用Excel进行编辑. Csv格式的文件,解析起来也很简单,所以自己动手写写很快~(小若:我就喜欢拿来主义,你怎么着) 最近在用Lua写游戏,对于技能.怪物等配置,我还是选择用Csv~ 不得不说,Lua等脚本语言,在某些方面是C++没法比的,这次我就用Csv

【 D3.js 进阶系列 — 1.2 】 读取 CSV 文件时乱码的解决方法

在 D3 中使用 d3.csv 读取 CSV 文件时,有时会出现乱码问题.怎么解决呢? 1. 乱码问题 使用 d3.csv 读取 xxx.csv 文件时,如果 xxx.csv 文件使用的是 UTF-8 编码,不会有什么问题.当然,个人认为尽量使用 UTF-8 编码,可以在同一编码内使用各国文字. 但是,如果 xxx.csv 文件使用的是 utf-8 编码,使用 Microsoft Excel 打开的时候,可能会出现乱码,因为国内的 Excel 默认使用 GB2312 打开,而且在打开的时候不能选

Dynamic 365中读取CSV文件

Dynamic 365开发中对于读取CSV文件与2012略有不同.Dynamic 365中,对于文件的处理是先上传,后下载的过程.需要通过FileUpload control 和Upload strategy class ,FileUploadTemporaryStorageStrategy类来实现对于文件的读取和下载. 以下是一个简单的例子可供参考: Dilaog窗体,读取文件上传到本地服务器中,以URL方式可以查看 Public Object dialog() { DialogGroup d

C++ 把数组数据存入 CSV 文件,以及读取 CSV 文件的数据

1. CSV-百度百科 2. 代码 #pragma once //Microsoft Visual Studio 2015 Enterprise #include<iostream> #include<fstream> #include<string> #include<vector> #include<cstdio> #include<cstdlib> using namespace std; template<typenam

sparkR读取csv文件

sparkR读取csv文件 The general method for creating SparkDataFrames from data sources is read.df. This method takes in the path for the file to load and the type of data source, and the currently active SparkSession will be used automatically. SparkR suppo

CSV文件读取,解决汉字乱码

public String getDeptOuId(String openId) throws IOException { String deptId = ""; // 存储信息的文件的绝对路径  String csvPath = FileUtil.getWorkingPath()  .resolve(ConfigUtil.getConfig().get("idmappings")).toString(); System.out.print(csvPath); //

php读取csv文件类

php处理csv文件类: http://www.php100.com/cover/php/540.html <?php define("CSV_Start", 0); define("CSV_Quoted", 1); define("CSV_Quoted2", 2); define("CSV_Unquoted", 3); function readCSV($fh, $len, $delimiter = ',', $enc