SignalFile.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. using System;
  2. using System.Globalization;
  3. using System.IO;
  4. namespace Ips.Library.Signals
  5. {
  6. /// <summary>
  7. /// 信号文件
  8. /// </summary>
  9. public class SignalFile
  10. {
  11. public const string SigTimeFolderFormat = "yyyyMMdd_HH";
  12. public const string SigTimeFileFormat = "yyyyMMddHHmmss";
  13. public const string SigFreqFormat = "#######0.000###";
  14. public const string BandWidthFormat = "######0.###";
  15. /// <summary>
  16. /// 信号文件实体类
  17. /// </summary>
  18. public SignalFile()
  19. {
  20. }
  21. /// <summary>
  22. /// 采集文件http下载地址(HttpGet)
  23. /// </summary>
  24. public string DownloadUrl { get; set; }
  25. /// <summary>
  26. /// 信号时间
  27. /// </summary>
  28. public DateTime SigTime { get; set; }
  29. /// <summary>
  30. /// 信号频点
  31. /// </summary>
  32. public long SigFreq { get; set; }
  33. /// <summary>
  34. /// 信号带宽
  35. /// </summary>
  36. public int BandWidth { get; set; }
  37. /// <summary>
  38. /// 采样率
  39. /// </summary>
  40. public int Fs { get; set; }
  41. /// <summary>
  42. /// 接收站编码
  43. /// </summary>
  44. public string SiteCode { get; set; }
  45. /// <summary>
  46. /// 采集卡编码
  47. /// </summary>
  48. public string AdcCode { get; set; }
  49. /// <summary>
  50. /// 采集通道编号
  51. /// </summary>
  52. public int ChNum { get; set; }
  53. /// <summary>
  54. /// 卫星编号
  55. /// </summary>
  56. public string SatNum { get; set; }
  57. /// <summary>
  58. /// 目录名称
  59. /// </summary>
  60. public string DirectoryName => SigTime.ToString(SigTimeFolderFormat);
  61. /// <summary>
  62. /// 文件名称
  63. /// </summary>
  64. public string FileName => GetFileName(SigTime, SigFreq, BandWidth, Fs, SiteCode, AdcCode, ChNum, SatNum);
  65. /// <summary>
  66. /// 获取文件全路径
  67. /// </summary>
  68. public string GetLocalFullName(string dataRoot)
  69. {
  70. string fullName = Path.Combine(dataRoot, DirectoryName, FileName);
  71. return fullName;
  72. }
  73. /// <summary>
  74. /// 将文件名转换为信号文件对象
  75. /// </summary>
  76. /// <param name="input"></param>
  77. /// <returns></returns>
  78. public static SignalFile Parse(string input)
  79. {
  80. if (string.IsNullOrWhiteSpace(input)) return null;
  81. input = Path.GetFileNameWithoutExtension(input);
  82. var items = input.Split('_');
  83. var result = new SignalFile();
  84. DateTime sigTime;
  85. if (DateTime.TryParseExact(items[0], SigTimeFileFormat, CultureInfo.CurrentUICulture, DateTimeStyles.None, out sigTime))
  86. {
  87. result.SigTime = sigTime;
  88. }
  89. foreach (var item in items)
  90. {
  91. var key = item[0];
  92. var val = item.Substring(1);
  93. switch (key)
  94. {
  95. case 'F':
  96. result.SigFreq = double.TryParse(val, out double sigFreq) ? (long)Math.Round(sigFreq * 1e6, 0) : 0L;
  97. break;
  98. case 'W':
  99. result.BandWidth = double.TryParse(val, out double bandWidth) ? (int)Math.Round(bandWidth * 1e3) : 0;
  100. break;
  101. case 'C':
  102. result.Fs = int.TryParse(val, out int fs) ? fs : 0;
  103. break;
  104. case 'R':
  105. result.SiteCode = val;
  106. break;
  107. case 'K':
  108. result.AdcCode = val;
  109. break;
  110. case 'T':
  111. result.ChNum = int.TryParse(val, out int chNum) ? chNum : 0;
  112. break;
  113. case 'S':
  114. result.SatNum = val;
  115. break;
  116. }
  117. }
  118. return result;
  119. }
  120. /// <summary>
  121. /// 获取文件名称
  122. /// </summary>
  123. /// <param name="sigTime">信号时间</param>
  124. /// <param name="sigFreq">信号频点</param>
  125. /// <param name="bandWidth">信号带宽</param>
  126. /// <param name="fs">采样率</param>
  127. /// <param name="satNum">卫星编号</param>
  128. /// <param name="siteCode">站点编码</param>
  129. /// <param name="adcCode">采集卡编码</param>
  130. /// <param name="chNum">通道号</param>
  131. /// <param name="nullText">值为空时的替换符</param>
  132. /// <returns></returns>
  133. public static string GetFileName(DateTime? sigTime, long? sigFreq, int? bandWidth, int? fs, string siteCode, string adcCode, int? chNum, string satNum, string nullText = "")
  134. {
  135. string sigTimeText = sigTime.HasValue ? sigTime.Value.ToString(SigTimeFileFormat) : nullText;
  136. string sigFreqText = sigFreq.HasValue && sigFreq > 0 ? "_F" + Math.Round(sigFreq.Value * 1e-6, 6).ToString(SigFreqFormat) : nullText;
  137. string bandWidthText = bandWidth.HasValue && bandWidth > 0 ? "_W" + Math.Round(bandWidth.Value * 1e-3, 3).ToString(BandWidthFormat) : nullText;
  138. string fsText = fs.HasValue && fs > 0 ? "_C" + fs.Value.ToString() : nullText;
  139. string siteCodeText = !string.IsNullOrWhiteSpace(siteCode) ? "_R" + siteCode.Trim() : nullText;
  140. string adcCodeText = !string.IsNullOrWhiteSpace(adcCode) ? "_K" + adcCode.Trim() : nullText;
  141. string chNumText = chNum.HasValue && chNum > 0 ? $"_T{chNum}" : nullText;
  142. string satNumText = !string.IsNullOrWhiteSpace(satNum) ? "_S" + satNum.Trim() : nullText;
  143. return string.Concat(sigTimeText, sigFreqText, bandWidthText, fsText, siteCodeText, adcCodeText, chNumText, satNumText, ".dat");
  144. }
  145. /// <summary>
  146. /// 创建信号文件基础信息
  147. /// </summary>
  148. /// <param name="sigTime">信号时间</param>
  149. /// <param name="sigFreq">信号频点</param>
  150. /// <param name="bandWidth">信号带宽</param>
  151. /// <param name="fs">采样率(个)</param>
  152. /// <param name="satNum">卫星编号</param>
  153. /// <param name="siteCode">站点编码</param>
  154. /// <param name="adcCode">采集卡编码</param>
  155. /// <param name="chNum">通道号</param>
  156. /// <returns></returns>
  157. public static SignalFile Create(DateTime sigTime, long sigFreq, int bandWidth, int fs, string siteCode, string adcCode, int chNum, string satNum)
  158. {
  159. var result = new SignalFile()
  160. {
  161. SigTime = sigTime,
  162. SigFreq = sigFreq,
  163. BandWidth = bandWidth,
  164. Fs = fs,
  165. SiteCode = siteCode,
  166. AdcCode = adcCode,
  167. ChNum = chNum,
  168. SatNum = satNum
  169. };
  170. return result;
  171. }
  172. }
  173. }