注意
功能扩充为(csv转其他语言(Lua,Unity Asset)代码文件)
功能扩充为(csv转其他语言(Lua,Unity Asset)代码文件)
功能扩充为(csv转其他语言(Lua,Unity Asset)代码文件)
<功能扩充>如果有需要可以查看上方的博客链接,里面有git地址
- 可以将csv,tsv,xls生成lua文件或生成Unity的Asset文件
- 可以对客户端和服务器分别打表
C#读取CSV文件
功能
- 读取CSV文件并反射为对象实例
- 由于各个渠道得到的csv格式不同,此处使用的是office表格导出的csv文件
- 将读到的数据写入对象中,并返回出去
- 使用属性标签表示类中的属性是否都需要写入
- 可以写入的只能是字段
属性标签
做了两种属性
- 需要写入值,并修改名字
/// <summary>
/// 表示需要写入value,并使用自定义name
/// </summary>
public class WriteValueAttribute : Attribute {
//自定的name
public string m_name;
//属性信息,在反射时填充
public PropertyInfo m_property;
/// <summary>
/// 初始化 <see cref="T:System.Attribute" /> 类的新实例。
/// </summary>
public WriteValueAttribute(string name) {
m_name = name;
}
}
2.不需要写入值
/// <summary>
/// 表示不需要写入value,如果没有这个属性标签,将会以属性名作为name
/// </summary>
public class NonWriteValueAttribute : Attribute {
}
3.不需要修改名字则不打标签
加了WriteValueAttribute标签的,将会用设置的name
加了WriteValueAttribute标签的,必须有setter,否则将会略过并报错
加了NonWriteValueAttribute标签的,将不会被写入
没有加标签的,如果有setter,将会写入,如果数据不存在,会报错
没有加标签的,如果没有有setter,将会略过
反射部分
先上代码
/// <summary>
/// 反射泛型中的属性,只反射拥有setter的属性
/// </summary>
internal class Refect {
/// <summary>
/// 反射到的属性
/// </summary>
public List<PropertyInfo> Property;
/// <summary>
/// 拥有<see cref="WriteValueAttribute" />的属性标签
/// </summary>
public List<WriteValueAttribute> PropertyName;
public Refect(Type type) {
var ps = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
var infos = new List<PropertyInfo>();
var infoNames = new List<WriteValueAttribute>();
foreach (var item in ps) {
if (item.GetCustomAttribute<NonWriteValueAttribute>() != null)
continue;
if (!item.CanWrite) {
if (item.GetCustomAttribute<WriteValueAttribute>() != null)
Debug.LogError(type.Name + "的属性" + item.Name + "没有setter");
continue;
}
infos.Add(item);
var att = item.GetCustomAttribute<WriteValueAttribute>();
if (att != null) {
att.m_property = item;
infoNames.Add(att);
}
}
Property = infos;
PropertyName = infoNames;
}
}
反射到所需的属性后并不直接返回,而是保存起来.使这个类作为对象使用
构造对象时获取所有共有属性
var ps = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
然后循环数组根据标签获取需要的属性保存
Csv读取的class
读取文件
读取文件时使用下面的API
//fullName是文件名(包含路径),encoding是编码方式
var lines = new List<string>(File.ReadLines(fullName, encoding));
编码方式可以用utf-8,但是如果有中文的话可能会乱码.
如果用office表格导出的csv,则显示中文需要使用gb2312
var encoding = Encoding.GetEncoding("gb2312");
读取title(字段名!)
title对应字段名
或属性标签中设置的name
这里遵循C#的命名规范,所以不会有特殊字符( , " \ 等)
可以直接以,
分割
new List<string>(titleStr.Trim().Split(','));
读取数据(values)
- 如果数据是字符串则会在两边添加一对
""
- 字符串中有
,
的情况也需要考虑 - 读取到的数据将是二维数组,一行为一个对象
private static List<List<string>> ReadValue(List<string> lines) {
var resList = new List<List<string>>();
foreach (var line in lines) {
var valueList = new List<string>();
var datas = line.Split(',');
var queue = new Queue<string>();
foreach (var data in datas)
if (queue.Count