天天看點

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  "";
}      

繼續閱讀