天天看点

Cocos2d-js读取csv文件工具类

在游戏开发中,一般会将一些游戏的配置信息保存到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  "";
}      

继续阅读