大侠
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

266 lines
8.6 KiB

import { assetManager, js, TextAsset } from "cc";
import { EBundleName } from "../const/GameEnum";
import { ObjectArray } from "../const/GameInterface";
import ResLoad from "../ResUrl/ResLoad";
import { ICsvData } from "./CsvList";
import { run } from "node:test";
import { PREVIEW } from "cc/env";
export default class CSVTools {
public static 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;
}
public static async LoadCsv(url: string, onCompleted: Function, cnf: ICsvData) {
ResLoad.Ins.Load(url, EBundleName.Presets, TextAsset, (err, res: TextAsset) => {
if (err || !res) {
ConsoleEx.Error("加载失败", url, res, err);
return;
}
onCompleted && onCompleted(this.parse(res.text, cnf), res.name);
assetManager.releaseAsset(res)
});
}
public static LoadCsvByText(text: string, onCompleted: Function, cnf: ICsvData) {
onCompleted(this.parse(text, cnf), cnf.name);
}
public static parse(csv_txt: string, cnf: ICsvData, _: string = ',') {
let type = cnf.type;
let txt_array = this.CSVToArray(csv_txt, _);
let keys = txt_array[0];
let types = txt_array[2]
let params = type == 'object' ? {} : [];
for (let i = 3; i < txt_array.length; i++) {
let b = { id: parseInt(txt_array[i][0]) };
for (let k = 1; k < keys.length; k++) {
if (types[k] == 'int') {
b[keys[k]] = Number(txt_array[i][k]);
} else if (types[k] == 'array') {
b[keys[k]] = this.isParseArray(txt_array[i][k], keys[k], i)
} else if (types[k] == 'strArray') {
b[keys[k]] = this.isParseStrArray(txt_array[i][k], keys[k])
} else if (types[k] == 'objectArray') {
b[keys[k]] = this.isParseObjectArray(txt_array[i][k], keys[k])
} else if (types[k] == 'object') {
b[keys[k]] = this.isParseObject(txt_array[i][k], keys[k])
} else if (types[k] == 'comobject') {
b[keys[k]] = this.isParaseComObject(txt_array[i][k], keys[k])
} else {
b[keys[k]] = txt_array[i][k];
}
}
if (type == 'object') {
params[txt_array[i][1]] = b
} else {
params['push'](b);
}
}
return this.check(params, cnf);
}
/** 整理数据 */
private static check(json, data: ICsvData) {
if (!data.check) {
return json;
}
let params = {};
let checks = data.check;
if (Array.isArray(checks)) {
for (let i = 0; i < checks.length; i++) {
if (i == 0) {
params = this.checkData(json, checks[i]);
} else {
if (data.type2 || data.type3) {
for (let item in params) {
let t_params = {};
let array = params[item];
for (let j = 0; j < array.length; j++) {
let lv = array[j][checks[i]];
if (data.type2) {
lv -= 1;
}
t_params[lv] = array[j];
}
params[item] = t_params;
}
} else {
for (let item in params) {
params[item] = this.checkData(params[item], checks[i]);
}
}
}
}
} else if (js.isString(checks)) {
for (let key in json) {
let stype = json[key] ? json[key][checks] : null;
params[stype] = json[key];
}
}
return params;
}
/** 整理数据 */
private static checkData(param, check) {
let params = {};
try {
for (let key in param) {
let stype = param[key][check]
if (!params[stype]) {
params[stype] = [];
}
params[stype].push(param[key]);
}
return params;
} catch {
ConsoleEx.Error('解析失败: ' + param + " " + check)
return params;
}
}
/*** 解析object */
public static isParseObject(value, key) {
try {
let object = {};
if (value.length == 0) {
return object;
}
if (value.length == 2) {
return object;
}
let str = value.substring(1, value.length - 1);
let array = str.split(',');
for (let o = 0; o < array.length; o++) {
let oarray = array[o].split(':');
object[oarray[0]] = Number(oarray[1])
}
return object;
} catch (e) {
ConsoleEx.Error('解析失败: ' + key + " " + value)
return null;
}
}
/** 解析字符数组 */
public static isParseStrArray(value, key) {
try {
let strArray = [];
let str: string = value.substring(1, value.length - 1);
let array = str.split(',');
while (array[0] == "") {
array.shift();
}
strArray = array
return strArray;
} catch (e) {
ConsoleEx.Error('解析失败: ' + key + " " + value)
return null;
}
}
/** 解析数组 */
public static isParseArray(value: string, key, idx: number) {
value = value.replace(new RegExp("\n", "g"), "")
if (!value || value.length == 0) { return []; }
try {
return JSON.parse(value);
} catch (e) {
ConsoleEx.Error('解析失败: ' + key + " " + "第" + (idx + 1) + "行" + " " + value)
return [];
}
}
/** 解析数组对象 */
public static isParseObjectArray(value, key) {
let datas: ObjectArray = [];
if (value.length <= 2) {
return datas;
}
let str = value.substring(1, value.length - 1);
let array = str.split(',');
for (let o = 0; o < array.length; o++) {
let oarray = array[o].split(':');
oarray.length != 2 && ConsoleEx.Error('解析数组对象失败: ' + value + ' key: ' + key);
datas.push({ key: Number(oarray[0]), value: Number(oarray[1]) })
}
return datas;
}
/** 解析复合类型 */
public static isParaseComObject(value, key) {
if (value == undefined) {
return [];
}
let str = value.substring(1, value.length - 1);
let object = str.split(',');
let param = [];
for (let i = 0; i < object.length; i++) {
let ps = object[i].split(':')
if (ps.length == 2) {
param.push({ type: Number(ps[0]), id: Number(ps[1]), num: Number(ps[1]) })
} else if (ps.length == 3) {
param.push({ type: Number(ps[0]), id: Number(ps[1]), num: Number(ps[2]) })
} else {
}
}
return param;
}
/** 解析复合类型 */
public static isParaseComObjectToJson(value) {
if (typeof value == "string") {
} else {
value = `${value}`
}
return JSON.stringify(CSVTools.isParaseComObject(value, 0));
}
}
if (PREVIEW) {
window["isParaseComObjectToJson"] = CSVTools.isParaseComObjectToJson;
}