This commit is contained in:
dingxiaowei
2022-09-08 21:35:00 +08:00
parent 0cc4354906
commit 752ecab6ad
+89 -10
View File
@@ -2,11 +2,15 @@
通用CSV/Excel打表工具
#### 前言
目前项目中用的csv转json工具,会带来严重的gc性能问题,例如启动加载慢,影响帧率等问题,转成的json数据,我们需要手动写对应的解析模板代码,所以针对以上问题,本通用打表工具应运而生,用二进制数据替代json数据会比较好的解决性能问题,而且能够自动生成对应的模板代码,节省了写重复代码的时间,而且二进制数据比json文件大小更小。
目前项目中用的csv转json工具,会带来严重的gc性能问题,例如启动加载慢,影响帧率等问题,转成的json数据,我们需要手动写对应的解析模板代码,所以针对以上问题,本通用打表工具应运而生,用二进制数据替代json数据会比较好的解决性能问题,而且能够自动生成对应的模板代码,节省了写重复代码的时间,而且二进制数据比json读取速度更快,文件大小更小。
#### 说明
因为csv有默认的逗号,这跟表中内容配置逗号会有冲突,不利于解析,所有产生了加强版的ExcelTool,读取路径下的csv和excel表格,如果是csv的这先转换成xlsx的excel,然后统一对excel进行数据读取解析操作,生成完之后再把csv生成的excel删掉,确保目录保持原样,所以ExcelTool是CsvTool的升级版
#### 功能
* 支持csv和Excel打表导出模板和数据
* 生成对应的数据模板代码&字段注释
* 支持csv和Excel打表
* 生成对应的数据模板代码
* 支持生成模板代码字段注释
* 生成二进制文件
* 自动将文件拷贝到对应的工程目录
* 二进制数据读取
@@ -23,7 +27,7 @@
![](img/2.jpg)
相比较json,二进制文件大小只有其1/4
##### 生成的自动化模板代码
##### 自动生成的模板代码
```
/*
* auto generated by tools(注意:千万不要手动修改本文件)
@@ -32,6 +36,8 @@
using System;
using System.IO;
using System.Collections.Generic;
using System.Text;
using System.Linq;
[Serializable]
public class avatarguideTest : IBinarySerializable
@@ -118,10 +124,30 @@ public class avatarguideTest : IBinarySerializable
}
}
}
public override string ToString()
{
var str = $"Id:{Id} Gender:{gender} age:{age} bValue:{bValue} ";
if (vector != null)
{
str += $"vector:[{vector[0]},{vector[1]},{vector[2]}] ";
}
if (Grid != null)
{
str += "Grid:[";
for (int i = 0; i < Grid.Count; i++)
{
str += $"[{Grid[i][0]},{Grid[i][1]},{Grid[i][2]}]";
if (i < Grid.Count - 1)
str += ",";
}
str += "]";
}
return str;
}
}
[Serializable]
public class avatarguideTestList : IBinarySerializable
public partial class avatarguideTestConfig : IBinarySerializable
{
public List<avatarguideTest> avatarguideTestInfos = new List<avatarguideTest>();
public void DeSerialize(BinaryReader reader)
@@ -143,9 +169,25 @@ public class avatarguideTestList : IBinarySerializable
avatarguideTestInfos[i].Serialize(writer);
}
}
public IEnumerable<avatarguideTest> QueryById(int id)
{
var datas = from d in avatarguideTestInfos
where d.Id == id
select d;
return datas;
}
public override string ToString()
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < avatarguideTestInfos.Count; i++)
{
sb.Append($"{avatarguideTestInfos[i].ToString()}\n");
}
return sb.ToString();
}
}
```
#### 使用案例
@@ -162,7 +204,40 @@ else
ConsoleHelper.WriteErrorLine("读取失败");
}
```
![](img/3.jpg)
![f72a068ec36233ddf1e97f9e401c0ce8_890x514.png@900-0-90-f.png](http://image.huawei.com/tiny-lts/v1/images/f72a068ec36233ddf1e97f9e401c0ce8_890x514.png@900-0-90-f.png)
##### Unity解析二进制
将二进制文件(后缀必须是.bytes)放在Resources目录,然后通过Resources.Load接口加载
```
var bytes = Resources.Load<TextAsset>("avatarguideTest");
if (bytes == null)
{
return;
}
IBinarySerializable newavList = new avatarguideTestConfig();
var readOK = FileManager.ReadBinaryDataFromBytes(bytes.bytes, ref newavList);
if (readOK)
{
Debug.Log(newavList.ToString());
//根据Id查询数据
//var avatarguideTest = (avatarguideTestConfig)newavList;
//var obj = avatarguideTest.QueryById(2);
//if (obj != null && obj.Count() > 0)
// Debug.Log(obj.FirstOrDefault().ToString());
}
else
{
Debug.LogError("数据读取错误");
}
```
##### 查询数据
```
var avatarguideTest = (avatarguideTestConfig)newavList;
var obj = avatarguideTest.QueryById(2);
if (obj != null && obj.Count() > 0)
ConsoleHelper.WriteInfoLine(obj.FirstOrDefault().ToString());
```
#### 自动化拷贝批处理
```
@@ -179,9 +254,10 @@ echo "拷贝完成"
pause
```
如果想要执行当前目录下的某个文件夹 可以cd xxx,如果需要深度拷贝,可以for /r %%i in (*.dat) do()
#### 扩展类方法
上面的config类采用的是partical class 就是为了方便扩展自定义的方法,如果想要添加自定义方法也定义一个partical class文件作为扩展即可
#### 扩展的功能
#### 扩展的功能
目前还不是最理想的状态,还有很多可以扩展完善的功能,如下:
* 支持生成各种类型的文件,例如json、xml、proto等
@@ -189,3 +265,6 @@ pause
* 支持Excel数据配置规范性检测,例如手误配置不符合规范导致加载异常,例如大小写逗号(肉眼容易忽略),或者空格等等
* 支持Excel字段客户端服务器可选项
* 支持更多自定义数据类型扩展
#### 代码
https://github.com/dingxiaowei/ExcelTool 喜欢麻烦点个star吧