关于使用 C# 处理水位数据多种格式的统一转换

关于使用 C# 处理水位数据多种格式的统一转换

  • 1、前言
  • 2、水位数据的多种格式
  • 3、水位数据多种格式的统一转换程序展示
  • 4、水位数据多种格式的统一转换 C# 代码
    • 4.1、声明引用命名空间
    • 4.2、多种格式的统一转换 C# 代码
    • 4.3、多种格式的统一转换 C# 代码,文件输出保存

1、前言

YAC9900 水位雨量存储器有很多固件版本,SD 卡存储的数据存在多种数据格式。统一转换数据格式精简优化编程代码。
同时多种版本的文件在打开对话框进行多选文件,合并所有月份的数据,整合数据文件。

2、水位数据的多种格式

因 YAC9900 版本不同,SD卡存储数据格式有四种情况

        1、日期、时间、水位(Z:)、雨量(PT:)、电压(VT:)"2024/03/31 23:55:00 Z:28.29 PT:976.5 VT:12.91",2、数据个数、日期、时间、水位(Z:)、雨量(PT:)、电压(VT:)"num1120 2024/07/02 09:45:00 Z:34.94 PT:269.5 VT:14.24",3、日期、时间、水位、雨量、电压"2024/04/30 23:55:00 29.179 277.5 12.71",4、每30分钟记录水位,其它无水位:"2021/01/01 00:00:00 Z:27.37 PT:0 VT:11.31","2021/01/01 00:05:00 PT:0 VT:11.33","2021/01/01 00:10:00 PT:0 VT:11.36","2021/01/01 00:15:00 PT:0 VT:11.30","2021/01/01 00:20:00 PT:0 VT:11.31","2021/01/01 00:25:00 PT:0 VT:11.32","2021/01/01 00:30:00 Z:27.36 PT:0 VT:11.23",

从上面数据可以看出,以空格分解;
设定以第一列为日期,则后面依次是:第二列为时间,则第三列为水位,第四列为雨量,第五列为设备电压。

3、水位数据多种格式的统一转换程序展示

在这里插入图片描述

4、水位数据多种格式的统一转换 C# 代码

4.1、声明引用命名空间

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Globalization;

4.2、多种格式的统一转换 C# 代码

                 Array.Sort(FilesList);//打开对话框选择多个 SD 卡数据文件后,进行文件字符串排序//Console.WriteLine("文件列表: " + String.Join("\r\n", x));string FilePathName = FilesList[0];int Pos = FilePathName.LastIndexOf(".");List<string> WaterLevelAndRain = new List<string>();foreach (string FileStr in FilesList){using (StreamReader sr = new StreamReader(FileStr)){string line;while ((line = sr.ReadLine()) != null){WaterLevelAndRain.Add(line);//将多文件的所有数据添加到LIST列表}}}//Console.WriteLine("原始列表: " + String.Join("\r\n", WaterLevelAndRain));WaterLevelAndRain.RemoveAll(str => string.IsNullOrEmpty(str));//删除LIST空值WaterLevelAndRain = WaterLevelAndRain.Distinct().ToList();//删除LIST重复项,即删除 行数据 重复值string[] WR = WaterLevelAndRain.ToArray();//转换为数组WaterLevelAndRain.Clear();//清除列表,,释放内存空间int WRL = WR.Length;//Console.WriteLine(WR.Length);DateTime[] DataDT = new DateTime[WRL];Double[] WL = new double[WRL];Double[] RL = new double[WRL];for (int i = 0; i < WRL; i++){string[] split = WR[i].Split(',', ' ', '\t');//以逗号、空格、制表符分裂int num1 = split[0].IndexOf("num");int num2;if (num1 == 0)//前有num,新YAC9900前有数据个数标志 num{DataDT[i] = DateTime.Parse(split[1] + " " + split[2]);//整合为时间序列num2 = split[3].IndexOf(":");//水位有前缀的按冒号分裂if (num2 > 0){int num3 = split[3].IndexOf("Z:");if (num3 == -1)//数据无水位:        {WL[i] = -20000;//假定为无效水位,没有正常读取传感器的水位int index = split[3].IndexOf(':') + 1;string R = split[3].Substring(index);RL[i] = Convert.ToDouble(R);}else{int index = split[3].IndexOf(':') + 1;string W = split[3].Substring(index);index = split[4].IndexOf(':') + 1;string R = split[4].Substring(index);WL[i] = Convert.ToDouble(W);RL[i] = Convert.ToDouble(R);}}else{WL[i] = Convert.ToDouble(split[3]);RL[i] = Convert.ToDouble(split[4]);}}else if (num1 == -1)//前无num{int test = split[0].IndexOf('/');if (test > 4)//旧YAC_BUG,在日期数据前出现文件名{split[0] = split[0].Substring(test - 4);}DataDT[i] = DateTime.Parse(split[0] + " " + split[1]);num2 = split[2].IndexOf(":");if (num2 > 0){int num3 = split[2].IndexOf("Z:");if (num3 == -1)//无水位:        {WL[i] = -20000;//假定为无效水位int index = split[2].IndexOf(':') + 1;string R = split[2].Substring(index);RL[i] = Convert.ToDouble(R);}else{int index = split[2].IndexOf(':') + 1;string W = split[2].Substring(index);index = split[3].IndexOf(':') + 1;string R = split[3].Substring(index);WL[i] = Convert.ToDouble(W);RL[i] = Convert.ToDouble(R);}}else{WL[i] = Convert.ToDouble(split[2]);RL[i] = Convert.ToDouble(split[3]);}}//Console.WriteLine(String.Join(",", split));//Console.WriteLine(DataDT[i]);//Console.WriteLine(WL[i]);//Console.WriteLine(RL[i]);//Console.WriteLine();}

4.3、多种格式的统一转换 C# 代码,文件输出保存

                string StartDate = DataDT[0].ToString("yyyy年MM月dd日", CultureInfo.InvariantCulture);//获取数据的开始日期string EneDate = DataDT[WRL - 1].ToString("yyyy年MM月dd日", CultureInfo.InvariantCulture);//获取数据的结束日期string RainFilePathName = FilePathName.Substring(0, Pos) + "-" + StartDate + "至" + EneDate + "雨量" + FilePathName.Substring(Pos);string WaterLevelFilePathName = FilePathName.Substring(0, Pos) + "-" + StartDate + "至" + EneDate + "水位" + FilePathName.Substring(Pos);FileStream SaveWLFS = new FileStream(WaterLevelFilePathName, FileMode.Create);StreamWriter SWWLFS = new StreamWriter(SaveWLFS, Encoding.GetEncoding("gb2312"));FileStream SaveRAFS = new FileStream(RainFilePathName, FileMode.Create);StreamWriter SWRAFS = new StreamWriter(SaveRAFS, Encoding.GetEncoding("gb2312"));for (int i = 0; i < WRL; i++){string OutWL = "";string OutRA = "";if (i == 0 && WL[i] != -20000){OutWL = DataDT[i].ToString("yyyy/MM/dd HH:mm ", CultureInfo.InvariantCulture) + ((int)(WL[i] * 100)).ToString("000000");OutRA = DataDT[i].ToString("yyyy/MM/dd HH:mm ", CultureInfo.InvariantCulture) + RL[i].ToString("0000.0");}else if (WL[i] != -20000 && DataDT[i] != DataDT[i - 1]){OutWL = DataDT[i].ToString("yyyy/MM/dd HH:mm ", CultureInfo.InvariantCulture) + ((int)(WL[i] * 100)).ToString("000000");OutRA = DataDT[i].ToString("yyyy/MM/dd HH:mm ", CultureInfo.InvariantCulture) + RL[i].ToString("0000.0");}else if (i == WRL - 1 && WL[i] == -20000)//最后一个是-20000{OutWL = "";OutRA = DataDT[i].ToString("yyyy/MM/dd HH:mm ", CultureInfo.InvariantCulture) + RL[i].ToString("0000.0");}else if (i > 0 && WL[i] == -20000 && WL[i + 1] != -20000 && WL[i - 1] != -20000 && Math.Abs(WL[i + 1] - WL[i - 1]) <= 0.03 && DataDT[i] != DataDT[i - 1]){WL[i] = (WL[i + 1] + WL[i - 1]) / 2;OutWL = DataDT[i].ToString("yyyy/MM/dd HH:mm ", CultureInfo.InvariantCulture) + ((int)(WL[i] * 100)).ToString("000000");OutRA = DataDT[i].ToString("yyyy/MM/dd HH:mm ", CultureInfo.InvariantCulture) + RL[i].ToString("0000.0");}else{OutWL = "";OutRA = DataDT[i].ToString("yyyy/MM/dd HH:mm ", CultureInfo.InvariantCulture) + RL[i].ToString("0000.0");}if (OutWL != ""){SWWLFS.WriteLine(OutWL);}SWRAFS.WriteLine(OutRA);OutWL = "";OutRA = "";//Console.WriteLine(OutWL);//Console.WriteLine();// OutSTR = DataDT[i].ToString("yy/MM/dd hh:mm ", CultureInfo.InvariantCulture) + RL[i].ToString("0000.0");}SWWLFS.Flush();//关闭打开的文件,释放内存空间SWWLFS.Close();SWRAFS.Flush();SWRAFS.Close();Array.Clear(DataDT, 0, WRL);//关闭数组,释放内存空间Array.Clear(WL, 0, WRL);Array.Clear(RL, 0, WRL);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/56379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django进一步掌握(10月22日)

一、请求响应对象 请求对象request 响应对象HttpResponse 二、HttpResponse常用属性 status设置HTTP响应状态码 status_code查询HTTP响应状态码 content_type设置响应的类型 write()写入响应内容 三、重定向 1、实现URl访问的重定向 &#xff08;1&#xff09;使用Ht…

【尊享面试100题】数组/字符串

多看优秀的代码 1.数组列表中的最大距离2.字符串的左右移3.相隔为1的编辑距离4.形成字符串的最短路径5.连接二进制表示可形成的最大数值 1.数组列表中的最大距离 给定 m 个数组&#xff0c;每个数组都已经按照升序排好序了。 现在你需要从两个不同的数组中选择两个整数&#…

微知-Lecroy力科的PCIe协议分析仪型号命名规则(PCIe代,金手指lanes数量)

文章目录 要点主要型号命名规则各代主要产品图片Summit M616 协议分析仪/训练器Summit T516 分析仪Summit T416 分析仪Summit T3-16分析仪Summit T28 分析仪 综述 要点 LeCroy(力科)成立于1964年&#xff0c;是一家专业生产示波器厂家。在美国纽约。一直把重点放在研制改善生产…

Hallo2 长视频和高分辨率的音频驱动的肖像图像动画 (数字人技术)

HALLO2: LONG-DURATION AND HIGH-RESOLUTION AUDIO-DRIVEN PORTRAIT IMAGE ANIMATION 论文&#xff1a;https://arxiv.org/abs/2410.07718 代码&#xff1a;https://github.com/fudan-generative-vision/hallo2 模型&#xff1a;https://huggingface.co/fudan-generative-ai/h…

TikTok营销实用技巧与数据分析工具:视频洞察

TikTok凭借其独特的机制和庞大的流量&#xff0c;成为了众多品牌和卖家对产品进行宣传推广的必要平台之一。要在TikTok上优化营销效果、提升推广效率&#xff0c;可以使用平台提供的重要工具——视频洞察&#xff08;Video Insights&#xff09;。 一、视频洞察功能与技巧 视频…

React Native 项目使用Expo模拟器运行iOS和Android

iOS没有连接设备&#xff1a; 确保你已经用 USB 线将你的 iOS 设备连接到了你的 Mac。 设备未信任&#xff1a; 如果你的设备是第一次连接到 Mac&#xff0c;可能需要在设备上信任这台计算机。通常&#xff0c;当你连接设备时&#xff0c;设备上会弹出一个对话框&#xff0c;…

线性回归(一)

线性回归 1.基本术语 ①特征&#xff1a;预测所依据的自变量称为特征或协变量 ②标签&#xff1a;试图预测的目标称为标签或目标 2.举个栗子 线性假设是指目标&#xff08;房屋价格&#xff09;可以表示为特征&#xff08;面积和房龄&#xff09;的加权和&#xff0c;如下面…

YOLOv11入门到入土使用教程(含结构图)

一、简介 YOLOv11是Ultralytics公司在之前的YOLO版本上推出的最新一代实时目标检测器&#xff0c;支持目标检测、追踪、实力分割、图像分类和姿态估计等任务。官方代码&#xff1a;ultralytics/ultralytics&#xff1a;ultralytics YOLO11 &#x1f680; (github.com)https://g…

解决跨域问题

跨域是浏览器受同源策略的限制&#xff0c;同源策略是浏览器为确保资源安全&#xff0c;而遵循的一种策略&#xff0c;该策略对访问资源进行了一些限制&#xff08;如发送 ajax 请求&#xff0c;操作 dom&#xff0c;读取 cookie&#xff09;。 最常见的影响就是发送 ajax 请求…

【微知】如何通过命令行在非串口界面触发sysrq的help信息?(echo h > /proc/sysrq-trigger)

背景 在服务器上&#xff0c;触发sysrq通常需要在串口执行sysrq热键&#xff0c;比如 ~相关的操作 如何通过在ssh界面触发sysrq触发一些操作&#xff1f; 命令 通过sysrq指定的/proc接口文件进行操作 echo h > /proc/sysrq-trigger dmesg #产看输出的帮助信息然后根据打…

Junit + Mockito保姆级集成测试实践

一、做好单测&#xff0c;慢即是快 对于单元测试的看法&#xff0c;业界同仁理解多有不同&#xff0c;尤其是在业务变化快速的互联网行业&#xff0c;通常的问题主要有&#xff0c;必须要做吗&#xff1f;做到多少合适&#xff1f;现在没做不也挺好的吗&#xff1f;甚至一些大…

MYSQL-SQL-01-DDL(Data Definition Language,数据定义语言)

DDL&#xff08;数据定义语言&#xff09; DDL&#xff08;Data Definition Language&#xff09;&#xff0c;数据定义语言&#xff0c;用来定义数据库对象(数据库&#xff0c;表&#xff0c;字段) 。 一、数据库操作 1、 查询mysql数据库管理系统的所有数据库 语法&#…

django(3)jinja2模版的使用

启动模版 安装jinja2 pip install jinja2 配置setting TEMPLATES中添加配置 {BACKEND: django.template.backends.jinja2.Jinja2,DIRS: [os.path.join(BASE_DIR,jinja2)], #模版在项目中的所在位置} template中各项的含义 这个配置项中模版自上而下加载&#xff0c;重名…

Spring Boot框架的电影评论系统设计与实现

3系统分析 3.1可行性分析 通过对本电影评论网站实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本电影评论网站采用SSM框架&#xff0c;JAVA作为开发语言&#…

基于单片机的智能小区门禁系统设计(论文+源码)

1总体架构 智能小区门禁系统以STM32单片机和WiFi技术为核心&#xff0c;STM32单片机作为主控单元&#xff0c;通过WiFi模块实现与手机APP的连接&#xff0c;构建整个门禁系统。系统硬件包括RFID模块、指纹识别模块、显示屏、按键以及继电器。通过RFID绑定IC卡、APP面部识别、指…

HarmonyOS鸿蒙分布式文件操作的时候权限问题

对于分布式文件跨设备操作的时候&#xff0c;一定记得设置文件等级权限&#xff0c;否则会出现各种不同的异常&#xff1a; setSecurityLabel 设置文件权限 代码&#xff1a; //设置文件权限securityLabel.setSecurityLabel(destUriPath, s1).then(() > {PhLog.info(Succee…

红队-安全见闻篇(下)

声明 学习视频来自B站UP主 泷羽sec的个人空间-泷羽sec个人主页-哔哩哔哩视频,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 硬件设备(知道对应的硬件上对应的扫描器就性) 一、硬件设备…

PHP中‘BITWISE AND‘运算符和‘LOGICAL AND‘运算符的区别

在PHP中&#xff0c;BITWISE AND&#xff08;位与&#xff09;运算符和LOGICAL AND&#xff08;逻辑与&#xff09;运算符都用于执行与操作&#xff0c;但它们作用于不同的数据类型&#xff0c;并产生不同的结果。 BITWISE AND 运算符 定义&#xff1a; BITWISE AND运算符&am…

Linux中Kconfig结构分析

目录结构中&#xff0c;某一层的内容无非就是&#xff0c;要么全是目录&#xff0c;要么全是文件&#xff0c;要么既有目录又有文件&#xff0c;我们的Kconfig文件通常是分布在各级目录中。那么&#xff0c;这些Kconfig如何一层一层地去组织起来呢&#xff1f; 首先明确下&…

切换主题的方案

1、link标签动态引入 其做法就是提前准备好几套CSS主题样式文件&#xff0c;在需要的时候&#xff0c;创建link标签动态加载到head标签中&#xff0c;或者是动态改变link标签的href属性 优点&#xff1a;实现了按需加载&#xff0c;提高了首屏加载时的性能 缺点&#xff1a; …