Пример #1
0
        /// <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);
        }
Пример #2
0
 /// <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");
     }
 }
Пример #3
0
 /// <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");
     }
 }
Пример #4
0
 /// <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;
     }
 }
Пример #5
0
 /// <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");
     }
 }