关于使用 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,一经查实,立即删除!

相关文章

微知-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;。 一、视频洞察功能与技巧 视频…

线性回归(一)

线性回归 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面部识别、指…

Linux中Kconfig结构分析

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

VTK的学习方法-第二类型应用

VTK的高级使用方法是自己写一个算法&#xff08;Filter&#xff09;&#xff0c;本文使用的数据类型位polydata&#xff0c;这个数据类型应用比较广泛。 我们的算法一般是继承VTK里面的vtkpolydataalgorithm&#xff0c;然后自己添加一些变量&#xff0c;重写&#xff08;over…

京东 北京 java 中级: 哪些情况下的对象会被垃圾回收机制处理掉? 哪些对象可以被看做是 GC Roots 呢?对象不可达,一定会被垃圾收集器回收么?

我同学最近在面试java的岗位, 这是他遇到的某些关于java的JVM中垃圾回收相关的部分的问题, 他来问我, 我特以此文章来解答. 公司 京东 base 北京 面试时间 2024年10月23日16:00:00 他跟我说, 面试官一上来就问了一个关于JVM的问题, 直接就给他难住了, 问题是 : 哪些情况下…

深入理解Qt中的QTableView、Model与Delegate机制

文章目录 显示效果QTableViewModel(模型)Delegate(委托)ITEM控件主函数调用项目下载在Qt中,视图(View)、模型(Model)和委托(Delegate)机制是一种非常强大的架构,它们实现了MVC(模型-视图-控制器)设计模式。这种架构分离了数据存储(模型)、数据展示(视图)和数据操作(委托),使…

通过Python爬虫获取商品销量数据,轻松掌握市场动态

为什么选择Python爬虫&#xff1f; 简洁易用&#xff1a;Python语言具有简洁的语法和丰富的库&#xff0c;使得编写爬虫变得简单高效。强大的库支持&#xff1a;Python拥有强大的爬虫框架&#xff08;如Scrapy、BeautifulSoup、Requests等&#xff09;&#xff0c;可以快速实现…

【记录】Django数据库的基础操作

数据库连接 在Django中使用 mysqlclient 这个包用于数据库的连接&#xff0c;切换至 Django环境中直接 pip install mysqlclient 安装此包 1 数据库连接配置 在项目目录下的setting.py中配置 DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: mini,#数据库名US…

uniapp修改input中placeholder样式

Uniapp官方提供了两种修改的属性方法&#xff0c;但经过测试&#xff0c;只有 placeholder-class 属性能够生效 <input placeholder"请输入手机验证码" placeholder-class"input-placeholder"/><!-- css --> <style lang"scss" s…

Python的买家秀大揭秘:用代码点亮API数据

在一个充满无限可能的数字世界里&#xff0c;Python侦探正准备开始他的新任务&#xff1a;揭开买家秀API数据的神秘面纱。这不仅是一次技术的挑战&#xff0c;更是一次与时间赛跑的较量。Python侦探&#xff0c;这位编程界的福尔摩斯&#xff0c;打开了他的笔记本电脑&#xff…