void Write(TableWriter writer, IValue value) { if (IsBasic || IsEnum) { if (IsArray) { var list = value as ValueList; if (list.IsEmptyValue()) { writer.WriteInt32(0); } else { writer.WriteInt32(list.Count); for (var i = 0; i < list.Count; ++i) { WriteBasic(writer, list[i].Value); } } } else { WriteBasic(writer, value.Value); } } else { WriteCustom(writer, value as ValueList, IsArray); } }
//生成data文件 void CreateDataFile() { if (mDataDirectory.IsEmptyString()) { return; } using (var writer = new TableWriter()) { writer.WriteInt32(mDatas.Count); //数据数量 writer.WriteString(LayoutMD5); //文件结构MD5 writer.WriteInt32(mFields.Count); //字段数量 foreach (var field in mFields) { if (field.IsBasic) { writer.WriteInt8(0); writer.WriteInt8((sbyte)field.BasicType.Index); } else { writer.WriteInt8(1); writer.WriteString(field.Type); } writer.WriteBool(field.IsArray); } writer.WriteInt32(0); //自定义类数量 var keys = new List <string>(); foreach (var data in mDatas) { if (keys.Contains(data.Key)) { throw new Exception($"ID有重复项[{data.Key}], 行:[{data.RowNumber}]"); } keys.Add(data.Key); for (var i = 0; i < mFields.Count; ++i) { var field = mFields[i]; try { field.Write(writer, data.Values[i]); } catch (Exception e) { throw new Exception($"行:{data.RowNumber} 列:{field.Name} {e.Message}"); } } } FileUtil.CreateFile($"{mName}.{mSuffix}", writer.ToArray(), mDataDirectory.Split(ScorpioConversion.Util.Separator)); } }
void WriteCustom(TableWriter writer, ValueList list, bool array) { var type = CustomType; if (array) { if (list.IsEmptyValue()) { writer.WriteInt32(0); } else { writer.WriteInt32(list.Count); for (var i = 0; i < list.Count; ++i) { WriteCustom(writer, list[i] as ValueList, false); } } } else { if (list.IsEmptyValue()) { for (var i = 0; i < type.Fields.Count; ++i) { type.Fields[i].Write(writer, new ValueString("")); } } else { var count = list.Count; if (count != type.Fields.Count) { throw new Exception($"字段数量与{type.Name}需求数量不一致 需要:{type.Fields.Count} 填写数量:{count} "); } for (var i = 0; i < count; ++i) { type.Fields[i].Write(writer, list[i]); } } } }
private void WriteCustom(TableWriter writer, ScriptArray list, List <PackageField> fields, bool array) { if (array) { if (Util.IsEmptyValue(list)) { writer.WriteInt32(0); } else { int count = list.Count(); writer.WriteInt32(count); for (int i = 0; i < count; ++i) { WriteCustom(writer, list.GetValue(i) as ScriptArray, fields, false); } } } else { if (Util.IsEmptyValue(list)) { for (int i = 0; i < fields.Count; ++i) { WriteField(writer, "", fields[i]); } } else { int count = list.Count(); if (count != fields.Count) { throw new Exception(string.Format("填写字段数量与数据机构字段数量不一致 需要数量 {0} 填写数量{1}", fields.Count, count)); } for (int i = 0; i < count; ++i) { WriteField(writer, list.GetValue(i), fields[i]); } } } }
private void WriteField(TableWriter writer, object value, PackageField field) { var basic = BasicUtil.GetType(field.Type); if (basic != null) { if (field.Array) { var list = value as ScriptArray; if (Util.IsEmptyValue(list)) { writer.WriteInt32(0); } else { int count = list.Count(); writer.WriteInt32(count); for (int i = 0; i < count; ++i) { basic.WriteValue(writer, list.GetValue(i).ToString()); } } } else { basic.WriteValue(writer, value.ToString()); } } else if (field.Enum) { if (field.Array) { var list = value as ScriptArray; if (Util.IsEmptyValue(list)) { writer.WriteInt32(0); } else { int count = list.Count(); writer.WriteInt32(count); for (int i = 0; i < count; ++i) { writer.WriteInt32(GetEnumValue(field.Type, value.ToString())); } } } else { writer.WriteInt32(GetEnumValue(field.Type, value.ToString())); } } else { WriteCustom(writer, value as ScriptArray, mCustoms[field.Type], field.Array); } }
void WriteBasic(TableWriter writer, string value) { if (IsBasic) { BasicType.WriteValue(writer, value); } else if (IsEnum) { writer.WriteInt32(GetEnumValue(value)); } else { throw new Exception($"当前类型不是基础类型 : {Type}"); } }
private void WriteFields(TableWriter writer, List <PackageField> fields) { writer.WriteInt32(fields.Count); for (int i = 0; i < fields.Count; ++i) { var field = fields[i]; var basic = BasicUtil.GetType(field.Type); if (basic != null) { writer.WriteByte(0); writer.WriteByte((sbyte)basic.BasicIndex); writer.WriteBool(field.Array); } else { writer.WriteByte(1); writer.WriteString(field.Type); writer.WriteBool(field.Array); } } }
//生成data文件数据 private void Transform_impl() { int iColums = mMaxColumn; //数据列数 int iRows = mMaxRow; //数据行数 TableWriter writer = new TableWriter(); writer.WriteInt32(0); //写入行数(最后计算出有效数据然后写入) writer.WriteString(GetClassMD5Code()); //写入文件MD5码 WriteFields(writer, mFields); //写入表结构 writer.WriteInt32(mUsedCustoms.Count); //写入用到的自定义类数量 foreach (var key in mUsedCustoms) { writer.WriteString(key); WriteFields(writer, mCustoms[key]); } List <string> keys = new List <string>(); int count = 0; for (int i = START_ROW; i < iRows; ++i) { string ID = ""; for (int j = 0; j < iColums; ++j) { string value = mDataTable[i][j]; var field = mFields[j]; try { if (string.IsNullOrEmpty(value)) { value = string.IsNullOrEmpty(field.Default) ? Util.EmptyString : field.Default; //数据为空设置为默认值 } if (j == 0) { if (keys.Contains(value)) { throw new Exception(string.Format("ID有重复项[{0}]", value)); } else if (Util.IsEmptyString(value)) { throw new Exception("ID字段不能为空"); } ID = value; keys.Add(value); } if (ExecuteField != null) { ExecuteField(field, ID, ref value); } var basic = BasicUtil.GetType(field.Type); if (basic != null || field.Enum) { if (field.Array) { WriteField(writer, Util.ReadValue(mEnums, mDataTable[i].RowNumber, Util.GetLineName(j), value, false, true), field); } else { WriteField(writer, value, field); } } else { WriteCustom(writer, Util.ReadValue(mEnums, mDataTable[i].RowNumber, Util.GetLineName(j), value, true, field.Array), mCustoms[field.Type], field.Array); } } catch (System.Exception ex) { throw new SystemException(string.Format("[{0}]行[{1}]列出错 数据内容为[{2}] : {3}", mDataTable[i].RowNumber, Util.GetLineName(j), value, ex.ToString())); } } count++; } writer.Seek(0); writer.WriteInt32(count); Create_impl(writer.ToArray()); }