分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
游戏中很多数据都是策划配置的Excel数据表,在使用中,我们一般会转化成csv文件,但是每改一次都要转一次也是麻烦,不如直接将Excel读取出来。
怎么解析呢,我们需要使用到一个插件,插件地址如下
http://exceldatareader.codeplex.com/
可以下载最新版引入到工程。在一个就是鉴于中文编码问题,这里的Excel要求是xlsx格式的,这样读出来的数据就不会出现乱码问题。
准备工作做好了,可以开工了。
private static DataTable GetTable(IExcelDataReader excelReader) { DataTable dt = new DataTable(); dt.TableName = excelReader.Name; bool isInit = false; string[] ItemArray = null; int rowsNum = 0; while (excelReader.Read()) { rowsNum++; if (rowsNum < 3) continue; if(!isInit) { isInit = true; for (int i = 0; i < excelReader.FieldCount + 1; i++) { dt.Columns.Add("", typeof(string)); } ItemArray = new string[excelReader.FieldCount]; } if (excelReader.IsDBNull(0)) { continue; } for (int i = 0; i < excelReader.FieldCount; i++) { string value = excelReader.IsDBNull(i) ? "" : excelReader.GetString(i); ItemArray[i] = value; } dt.Rows.Add(ItemArray); } return dt; } public static DataSet GetDataSet(string path) { FileStream stream = File.Open(path, FileMode.Open, FileAccess.Read); IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream); // DataSet ds = excelReader.AsDataSet();//excel有空时会报错 DataSet ds = new DataSet(); do { DataTable dt = GetTable(excelReader); ds.Merge(dt); } while (excelReader.NextResult()); excelReader.Close(); excelReader.Dispose(); stream.Close(); stream.Dispose(); return ds; } public static DataTable GetFirstDataTable(string path) { FileStream stream = File.Open(path, FileMode.Open, FileAccess.Read); IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream); DataTable dt = GetTable(excelReader); excelReader.Close(); excelReader.Dispose(); stream.Close(); stream.Dispose(); return dt; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
这是对应的读取代码,这里有一个问题,注释那一句
// DataSet ds = excelReader.AsDataSet();//excel有空时会报错
- 1
所以这里需要换个方式来写。
由于游戏的跨平台性,要讲数据存储成文本或二进制格式,这里我选了二进制,响应的代码如下
“`
public static byte[] GetFirstDataTableBytes(string path)
{
DataTable dt = GetFirstDataTable(path);
return TableToBytes(dt);
}
public static byte[] TableToBytes(DataTable dt){ byte[] bytes = null; List<byte[]> byteList = new List<byte[]>(); for (int i = 0; i < dt.Rows.Count; i++) { for (int j = 0; j < dt.Rows[i].ItemArray.Length; j++) { byte[] tmpBytes = ByteTools.WriteString(dt.Rows[i].ItemArray[j].ToString()); byteList.Add(tmpBytes); } } bytes = ByteTools.GetBytes(byteList); return bytes;}public static byte[] ExcelToBytes(DataSet ds){ byte[] bytes = null; int len = 0; for (int i = 0; i < ds.Tables.Count; i++) { byte[] tmpBytes = TableToBytes(ds.Tables[i]); bytes.CopyTo(tmpBytes, len); len += tmpBytes.Length; } return bytes;}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
根据项目具体需求也可自行定义数据结构,比如自动转换成csv文件等,定义特殊符号区分有效数据和策划注释等。
可以批量打包所有策划数据,经测试40多个数据表打包后解析时间为1秒的样子,包括数据转换,数据关联,由于文件大小问题,还使用了zip压缩,所以这里还包括了数据解压时间,效率上是可以接受的。
本文参考了雨松MOMO的文章,链接如下http://www.xuanyusong.com/archives/2429,感谢原作者提供好文章