在游戏开发中,一般会将一些游戏的配置信息保存到csv文件中,比如游戏有多个关卡,每个关卡失败之后的文案,分享的文案等等配置信息,我们在程序中通常就要读取csv文件的内容,然后通过代码解析文件数据,最后封装成一个类似二维数组的数据,里面存放着csv行和列的信息。
现在比如我们的res目录下有个levelConfig.csv文件,里面的内容如下:
关卡,关卡类名,标题,简介,胜利分享文案,失败求助文案,提示1,提示2,提示3
level,className,title,desc,winShareWord,helpWord,tips1,tips2
1,关卡1,标题1,desc1,胜利分享1,求助文案1,提示1,提示2
2,关卡2,标题2,desc2,胜利分享2,求助文案2,提示1,提示2
我们来首先来获取文件里面的内容。
function initLevelConfig(){
try{
cc.loader.loadTxt("res/levelConfig.csv",function(err,data){
if(err){cc.log(err);return;}
cc.log(data);
});
}catch(err){
cc.log("获取关卡配置总表错误:"+err);
}
}
通过cc.loader.loadTxt方法,就能够获取到文件里面的内容了,不过获取到的data是一串字符串,我们还必须将其解析,所以我们在这里使用一个解析csv文件的函数,将CSV转换为Array
//CSV转Array
function CSVToArray( strData, strDelimiter ) {
strDelimiter = (strDelimiter || ",");
var objPattern = new RegExp(
(
"(\\" + strDelimiter + "|\\r?\\n|\\r|^)" +
"(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" +
"([^\"\\" + strDelimiter + "\\r\\n]*))"
),
"gi"
);
var arrData = [[]];
var arrMatches = null;
while (arrMatches = objPattern.exec( strData )){
var strMatchedDelimiter = arrMatches[ 1 ];
if (
strMatchedDelimiter.length &&
(strMatchedDelimiter != strDelimiter)
){
arrData.push( [] );
}
if (arrMatches[ 2 ]){
var strMatchedValue = arrMatches[ 2 ].replace(
new RegExp( "\"\"", "g" ),
"\""
);
} else {
var strMatchedValue = arrMatches[ 3 ];
}
arrData[ arrData.length - 1 ].push( strMatchedValue );
}
return arrData;
}
我们使用这个方法,就能够把scv的那一串内容转换为一个二维数组,然后通过遍历这个二维数组,就能获取到我们想要的数据了:
function initLevelConfig(){
try{
cc.loader.loadTxt("res/levelConfig.csv",function(err,data){
if(err){cc.log(err);return;}
//csv数据二维数组
var csvArray=CSVToArray(data,",");
for(var i= 2;i<=csvArray.length-1;i++){
//rowData表示一行的数据
var rowData=csvArray[i];
//一行有很多列,遍历,获取每一列的内容
for(var j=0;j<rowData.length;j++){
//输出i行j列数据
cc.log(csvArray[i][j]);
}
}
});
}catch(err){
cc.log("获取关卡配置总表错误:"+err);
}
}
以下的方法是获取csv文件中指定行列对应的内容:
第一个参数是文件内容,
第二个参数是分割标记,CSV文件内容数据一般都是以逗号“,”分割的,默认为逗号“,“
第三个参数是行数
第四个参数是列数
function getStrByRowAndKeyFromCSV( strData, strDelimiter, row, key ) {
strDelimiter = (strDelimiter || ",");
var objPattern = new RegExp(
(
"(\\" + strDelimiter + "|\\r?\\n|\\r|^)" +
"(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" +
"([^\"\\" + strDelimiter + "\\r\\n]*))"
),
"gi"
);
var arrData = [[]];
var arrMatches = null;
while (arrMatches = objPattern.exec( strData )){
var strMatchedDelimiter = arrMatches[ 1 ];
if (
strMatchedDelimiter.length &&
(strMatchedDelimiter != strDelimiter)
){
arrData.push( [] );
}
if (arrMatches[ 2 ]){
var strMatchedValue = arrMatches[ 2 ].replace(
new RegExp( "\"\"", "g" ),
"\""
);
} else {
var strMatchedValue = arrMatches[ 3 ];
}
arrData[ arrData.length - 1 ].push( strMatchedValue );
}
for(var i = 0; i<arrData[1].length; i++){
if (arrData[1][i] == key){
return arrData[row+1][i]
}
}
return "";
}