在游戏开发中,一般会将一些游戏的配置信息保存到csv文件中,比如游戏有多个关卡,每个关卡失败之后的文案,分享的文案等等配置信息,我们在程序中通常就要读取csv文件的内容,然后通过代码解析文件数据,最后封装成一个类似二维数组的数据,里面存放着csv行和列的信息。
现在比如我们的res目录下有个levelConfig.csv文件,里面的内容如下:
关卡,关卡类名,标题,简介,胜利分享文案,失败求助文案,提示1,提示2,提示3 level,className,title,desc,winShareWord,helpWord,tips1,tips2 1,关卡1,标题1,desc1,胜利分享1,求助文案1,提示2 2,关卡2,标题2,desc2,胜利分享2,求助文案2,提示2
function initLevelConfig(){ try{ cc.loader.loadTxt("res/levelConfig.csv",function(err,data){ if(err){cc.log(err);return;} log(data); }); }catch(err){ 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文件内容数据一般都是以逗号“,”分割的,默认为逗号“,“
第三个参数是行数
第四个参数是列数
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( "\"\"","\"" ); } 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 ""; }