/// <summary> /// 读取一个数据集 /// </summary> /// <param name="stream">文件流</param> /// <param name="nextData">返回下一个数据集的起点</param> /// <param name="fileBeginOffset">数据集起始位,相对于流的起始位置</param> /// <returns></returns> public virtual FCS ReadDataset(Stream stream, out long nextData, long fileBeginOffset = 0) { if (fileBeginOffset > stream.Length) { throw new Exception("Offset is too big"); } FCS fcs = new FCS(); FCSFileParameter parameter = new FCSFileParameter(); ReadHead(stream, fileBeginOffset, parameter); AnalyseUTF8KeyValue(ReadBytes(stream, fileBeginOffset, parameter.TextBegin, parameter.TextEnd), fcs.TextSegment, parameter.DelimiterByte); FillParameterFromTextSegment(fcs.TextSegment, parameter); if (parameter.STextBegin != 0 && parameter.STextEnd != 0) { AnalyseUTF8KeyValue(ReadBytes(stream, fileBeginOffset, parameter.STextBegin, parameter.STextEnd), fcs.TextSegment, parameter.DelimiterByte); } if (parameter.AnalysisBegin != 0 && parameter.AnalysisEnd != 0) { AnalyseUTF8KeyValue(ReadBytes(stream, fileBeginOffset, parameter.AnalysisBegin, parameter.AnalysisEnd), fcs.AnalysisSegment, parameter.DelimiterByte); } fcs.Measurements = AnalyseParams(fcs.TextSegment, parameter.PAR, parameter.DataType); AnalyseData(stream, fileBeginOffset, parameter.DataBegin, parameter.DataEnd, fcs.Measurements, parameter.TOT, parameter.DataType, parameter.ByteOrd); nextData = parameter.NextData; return(fcs); }
/// <summary> /// 读取并解析header段和文本段的分隔符 /// </summary> /// <param name="stream">文件流</param> /// <param name="fileBeginOffset">数据集起始位置</param> /// <param name="parameter">参数</param> protected virtual void ReadHead(Stream stream, long fileBeginOffset, FCSFileParameter parameter) { byte[] headerBytes = new byte[58]; stream.Seek(fileBeginOffset, SeekOrigin.Begin); if (stream.Read(headerBytes, 0, 58) == 58) { string headerString = Encoding.ASCII.GetString(headerBytes); parameter.Version = headerString.Substring(0, 6); parameter.TextBegin = Convert.ToInt64(headerString.Substring(10, 8)); parameter.TextEnd = Convert.ToInt64(headerString.Substring(18, 8)); parameter.DataBegin = Convert.ToInt64(headerString.Substring(26, 8)); parameter.DataEnd = Convert.ToInt64(headerString.Substring(34, 8)); parameter.AnalysisBegin = Convert.ToInt64(headerString.Substring(42, 8)); parameter.AnalysisEnd = Convert.ToInt64(headerString.Substring(50, 8)); if (stream.Length >= fileBeginOffset + parameter.TextBegin + 1) { var delimiterByte = ReadBytes(stream, fileBeginOffset, parameter.TextBegin, parameter.TextBegin); if (delimiterByte != null && delimiterByte.Length == 1) { parameter.DelimiterByte = delimiterByte[0]; } } else { throw new Exception("Read Delimiter byte failed,stream length is not enough"); } } else { throw new Exception("Read head failed,stream length is not enough"); } }
/// <summary> /// 从文本段填充数据集参数 /// </summary> /// <param name="keyValues">文本段字典</param> /// <param name="parameter">需要完善的参数</param> protected override void FillParameterFromTextSegment(Dictionary <string, string> keyValues, FCSFileParameter parameter) { base.FillParameterFromTextSegment(keyValues, parameter); if (keyValues.ContainsKey(Keys.ModeKey) && ModeConvert.ConvertToEnum(keyValues[Keys.ModeKey]) != Mode.L) { throw new Exception("Can't analyse,mode must be L"); } if (keyValues.ContainsKey(Keys.ByteOrdKey) && ByteOrderConvert.ConvertToEnum(keyValues[Keys.ByteOrdKey]) == ByteOrd.Unknown) { throw new Exception("Can't analyse,byteord not supported"); } if (keyValues.ContainsKey(Keys.UnicodeKey) && !"UTF-8".Equals(keyValues[Keys.UnicodeKey].ToUpper()) && !"UTF8".Equals(keyValues[Keys.UnicodeKey].ToUpper())) { throw new Exception("Can't analyse,unicode must be utf-8"); } }
/// <summary> /// 从文本段填充数据集参数 /// </summary> /// <param name="keyValues">文本段字典</param> /// <param name="parameter">需要完善的参数</param> protected virtual void FillParameterFromTextSegment(Dictionary <string, string> keyValues, FCSFileParameter parameter) { if (keyValues == null) { throw new Exception("Text segment is null,can't analyse and fill parameter"); } if (parameter == null) { throw new Exception("FCS parameter is null,can't edit"); } if (keyValues.ContainsKey(Keys.BeginAnalysisKey) && long.TryParse(keyValues[Keys.BeginAnalysisKey], out long beginAnalysis)) { parameter.AnalysisBegin = beginAnalysis; } if (keyValues.ContainsKey(Keys.EndAnalysisKey) && long.TryParse(keyValues[Keys.EndAnalysisKey], out long endAnalysis)) { parameter.AnalysisEnd = endAnalysis; } if (keyValues.ContainsKey(Keys.BeginDataKey) && long.TryParse(keyValues[Keys.BeginDataKey], out long beginData)) { parameter.DataBegin = beginData; } if (keyValues.ContainsKey(Keys.EndDataKey) && long.TryParse(keyValues[Keys.EndDataKey], out long endData)) { parameter.DataEnd = endData; } if (keyValues.ContainsKey(Keys.BeginSTextKey) && long.TryParse(keyValues[Keys.BeginSTextKey], out long beginSText)) { parameter.STextBegin = beginSText; } if (keyValues.ContainsKey(Keys.EndSTextKey) && long.TryParse(keyValues[Keys.EndSTextKey], out long endSText)) { parameter.STextEnd = endSText; } if (keyValues.ContainsKey(Keys.ByteOrdKey)) { parameter.ByteOrd = ByteOrderConvert.ConvertToEnum(keyValues[Keys.ByteOrdKey]); } if (keyValues.ContainsKey(Keys.DataTypeKey)) { parameter.DataType = DataTypeConvert.ConvertToEnum(keyValues[Keys.DataTypeKey]); } if (keyValues.ContainsKey(Keys.NextDataKey) && long.TryParse(keyValues[Keys.NextDataKey], out long nextData)) { parameter.NextData = nextData; } if (keyValues.ContainsKey(Keys.PARKey) && uint.TryParse(keyValues[Keys.PARKey], out uint par)) { parameter.PAR = par; } if (keyValues.ContainsKey(Keys.TOTKey) && uint.TryParse(keyValues[Keys.TOTKey], out uint tot)) { parameter.TOT = tot; } }
/// <summary> /// 从文本段填充数据集参数 /// </summary> /// <param name="keyValues">文本段字典</param> /// <param name="parameter">需要完善的参数</param> protected override void FillParameterFromTextSegment(Dictionary <string, string> keyValues, FCSFileParameter parameter) { base.FillParameterFromTextSegment(keyValues, parameter); if (keyValues.ContainsKey(Keys.ModeKey) && ModeConvert.ConvertToEnum(keyValues[Keys.ModeKey]) != Mode.L) { throw new Exception("Can't analyse,mode must be L"); } }