基于C#的气象原始观测数据的分析与处理

2016-08-26 09:08王长利
中低纬山地气象 2016年1期
关键词:整理气象解析

王长利

(湖南省怀化市气象局自动化站,湖南 怀化 418000)



基于C#的气象原始观测数据的分析与处理

王长利

(湖南省怀化市气象局自动化站,湖南怀化418000)

根据工作实际需要,使用C#技术对以文本格式存放的各类原始气象观测数据加以解析与整理,通过定义C#的抽象类,将数据解析和数据存储有效分离,进而将整理后的数据输入到Excel文件或MSSQL数据库中保存,从而达到 “一次解析,按需存储”的目的,满足了将观测数据高效、方便、快捷、灵活地存储为不同文件格式的需求。同时,介绍了C#的多线程与委托技术在气象数据处理中的应用,以及利用MSChart组件对气象数据进行统计分析并绘制图形的方法,所涉及的程序设计思路对于气象数据的分析与处理具有一定的参考与借鉴意义。

观测数据;C#技术;多线程;抽象类;MSChart组件

1 引言

气象观测数据的分析与处理是气象业务中一项极其重要的内容。在日常气象观测工作中,有相当一部分原始气象数据是以文本格式的形式有规律地进行保存的,这类以文本格式存储的气象资料,往往不便于查询、分析与统计,通常需要事先对数据进行预处理,加以解析整理后,保存为Excel文件或导入到数据库中,再对数据加以分析与处理,以便获得有价值的信息。气象原始观测数据长达30 a以上,且按气象要素各自单独保存为一个文本文件,对于这类年份跨度长、数据量大、文件格式多的气象原始数据,该如何处理以满足将数据灵活、高效地保存为Excel文件或导入不同数据库的实际需要呢?本文基于C#的抽象类、多线程与委托技术,提出在分析与处理气象原始观测数据时,将数据解析与数据存储分离并保存为Excel文档或输入到数据库的方法。

2 处理程序简介

气象原始观测数据分析与处理程序是“气象资料档案信息化系统”的一个子模块,该模块主要功能是对气象原始观测数据进行整理与解析,按需导入Excel文件或MSSQL数据库,并提供数据查询、统计与分析、图形绘制等功能,所使用的数据为按气象要素分类保存的30 a以上的文本观测记录数据。图1为将天气现象原始观测数据同步导入Excel文件和MSSQL数据库时的程序运行界面。

3 各部分功能简介

3.1原始观测数据的处理

本文以原始气温数据为例,阐述解析与整理数据的方法,其它气象要素的处理方法可据此参考。

原始气温数据被保存在一个文本文件中,每一行记录着站点1 d的观测数据,从左至右依次对应观测的日期与时间、站号、4个时次(分别02、08、14、20时)的温度合计值、最高温度、最低温度等数据,各组数据之间以制表符分隔,其处理流程见图2。

3.1.1按指定编码读取原始数据在某些气象要素的原始观测文件中,使用了自定义的天气符号字符来记录各种天气现象,为了保证程序能够正确地读取观测数据,必须事先将编码指定为gb2312或GBK,再读取原始记录,其代码为:

Int32 encodindCode = 936;//默认为gb2312

string strOrg = File.ReadAllText(filePath,Encoding.GetEncoding(encodindCode));

其中filePath代表原始气温数据文件的保存路径。在读取文件时,最好一次性读取全部文件内容,不采取逐行读取的方式,逐行读取不利于从总体上分析与控制数据,也不利于数据定位。

3.1.2获取总记录数处理程序通过进度条和百分比显示数据分析与处理的整体进度,所以在解析

图1 处理程序运行界面Fig.1 Program running interface

图2 数据处理流程Fig.2 Data processing flow

数据前需要事先获知总记录数。程序将原始观测数据中的换行符全部替换为“@”,再借助Split函数将每条记录存放到数组中,则数组的长度便是原始数据的总记录数,主要代码如下:

strOrg = strOrg.Replace(" ", "#"); //每条记录中分隔数据的制表符用#替换

strOrg = strOrg.Replace(" ", "@");

string[] dateData = strOrg.Split(new char[]{'@'});

int lineCount = dateData.Length;//获取总记录数

3.1.3数据解析与提取在站点的原始气温数据中,每条记录均与站点某一天的气温观测数据相对应,通过上述的Split函数,已将每一天的记录存放到dateData数组中,利用foreach语句可读取每一天的数据,并将其作为抽象函数ParseData的参数传递,其部分代码如下:

startParseData(lineCount);

foreach (String strDay in dateData){

ParseData(strDay);

ParseDataInfo();

}

endParseData();

在上述代码中,startParseData(lineCount)、ParseData(strDay)、ParseDataInfo()和endParseData()均是抽象方法,分别在数据开始解析前、解析时和解析后被调用,这4个抽象函数仅为继承抽象类DataParse的子类OutputToExcel提供一个编程入口,以满足将数据写入不同文件时的需要。

在站点原始气温数据的处理中,考虑到每一条原始记录数据含义均清晰明了,因而没有对每一条记录加以解析便作为ParseData(strDay)函数的参数传递给继承类的实体。如果原始记录数据中存在特殊代码,就有必要进一步解析,并将解析整理好的记录数据作为参数传递。例如:在每小时观测文件中使用了特殊的天气符号,不同的符号代表着不同的天气现象,因而需要对这些特殊的符号进行解析,并整理成规范格式的字符串后,再作为函数ParseData(strDay)的参数进行传递。

3.2Excel文件的生成

为了将整理好的数据存储为不同的形式,需要在继承抽象类DataParse的子类中实现其父类的抽象方法ParseData(string gcData),并在该方法中将每一条观测记录gcData写入到Excel文件或MSSQL数据库中。

OutputToExcel类则是对抽象类DataParse的继承与实现,其类中的toExcel(string gcData)方法可将解析与整理好的数据存储到Excel文件中,具体的Excel的编程开发可参考有关资料[1-2]。将气象观测数据导入到Excel文件时,需要重点关注以下几点:

3.2.1大数据量的处理在Excel文件中,当一张表的记录数超过65 536条时,再在此表中添加新记录将会出错。对于近30 a大量观测数据的处理,可通过添加新表的方式避免上述问题的发生,其部分代码如下:

//获取当前表中下一条可用记录的行数

int rowCount=xSheet.UsedRange.Rows.Count+1;

//当前记录数超过65536时,添加一张新表

if (rowCount>65536){

sheetCount++;

xSheet = (Microsoft.Office.Interop.Excel.Worksheet)xBook.Sheets.Add(Missing.Value, xSheet, 1, Missing.Value);

rowCount = 1;//初始化当前记录数

}

3.2.2写入Excel文件在OutputToExcel类中,函数toExcel(gcData)所传递的参数正是整理解析后的每日气温观测记录,通过String[] dayDatas=gcData.Split(new char[]{'#'})便可获取到每条记录中的具体数值,将其写入到当前Excel表中,部分代码为:

rng = xSheet.get_Range(xSheet.Cells[rowCount,1],

xSheet.Cells[rowCount,dayDatas.Length]);

rng.Value2 = dayDatas;//数组方式赋值

3.2.3保存Excel文件为了确保程序退出后能及时保存写入Excel中的数据,并正常结束Excel进程以释放所占用的内存资源,在所有操作完毕后,应对当前xBook对象进行保存,并结束xApp实例。

上述任务是通过OutputToExcel类的close()函数来完成的,其部分代码如下:

xApp.DisplayAlerts = false;//不显示提示

Missing mv = Missing.Value;

xBook.SaveAs(excelFile,mv,mv,mv,mv,mv,XlSaveAsAccessMode.xlNoChange,mv,mv,mv,mv,mv);

xApp.Quit(); //结束Excel进程。

3.3统计分析

根据实际工作需要,程序提供了对解析整理后的各类气象要素进行统计分析的功能,主要包括:气温、海平面气压、相对湿度、风向、风速、云量、降水量、能见度等要素的统计分析。在主界面中点击“绘图”将对近30 a气象观测数据进行月统计和旬统计分析,运行界面如图3所示:

图3 统计分析界面Fig.3 Statistical analysis interface

在对各气象要素观测数据进行统计分析之前,需要事先把近30 a的原始观测数据解析整理后导入MSSQL数据库中。统计分析时,通过SQL查询语句从数据库中获取数据,再借助微软MSChart组件,将其加入图例数据系列,以线形图、柱状图等形式绘制各气象要素的统计分析结果。同时,为了方便统计与分析,程序设置有图例属性的编辑,并提供全局图、滚动图模式显示图形,支持最大值、最小值、平均值线的绘制等。

4 关键技术

由于各类气象要素的原始观测数据均以不同的文本文件单独存放,为了增强程序的可移植性、数据处理的灵活性以及代码的易维护性,在抽象类中提供对各类气象要素原始数据加以解析与整理的方法,并将最终处理好的每一条记录作为参数,通过统一的抽象方法传递,这样只需在其子类中实现该抽象方法,就能根据需要灵活地将整理好的数据导入到Excel文件或MSSQL数据库中。

试验结果表明,浮选金精矿经浮选分离—铅精矿、硫精矿分别再磨浸出工艺,可获得合格铅精矿,铅回收率79.83%,金总回收率为94.55%,其中贵液中金占91.83%,铅精矿中金占2.72%,银总回收率为91.67%,其中贵液中银占76.26%,铅精矿中银占15.41%,铅精矿中少量不能浸出金、银可随之计价销售。此方案避免了方案一中金、银计价销售影响收益的问题。

4.1类

为了实现将观测数据存储为不同的形式,程序将数据的解析定义为一个抽象类DataParse,而数据的存储则定义为对该抽象类继承的子类(如OutputToExcel类负责将数据存储到Excel文件中,OutputToMSSQL类负责将数据导入MSSQL数据库中),从而保证了气象观测数据解析与存储的分离,以满足“一次解析,按需存储”的实际需求。文中所涉及的类及其函数说明如表1所示。

表1 抽象类DataParse及其子类OutputToExcel说明

本程序开发中还涉及到其它类,如负责界面显示的主界面类FrmMain;负责数据库连接与操作的数据库类DB;继承与实现抽象类DataParse并负责将数据写入MSSQL数据库的 OutputToMSSQL类,等等。

4.2多线程

站点各气象要素的原始数据文件保存了近30 a的观测数据,对其进行解析、整理、生成Excel文件或写入MSSQL数据库是一件非常费时的工作。如果使用单一线程,在解析整理数据时,程序界面中某些控件的内容将得不到及时更新,会造成程序运行不流畅、没有响应的“假死”或“卡顿”等现象,严重的甚至会导致鼠标、键盘无反应,计算机无法操作与使用。

为了避免上述问题的发生,提高数据处理的效率,利用C#的多线程技术[3],将数据的解析、整理与存储放到后台自动处理,前台界面主要滚动显示后台处理程序整理后的每一条记录,并通过进度条显示数据处理进度。同时,程序还采用了C#的委托技术[3],以确保前、后台线程之间数据安全、顺畅地传递。委托的部分代码如下:

//定义委托代理

delegate void SetTextCallback(string text);

private void SetText(string text){

if (myfrm.myTxtShow.InvokeRequired){

SetTextCallback d = new SetTextCallback(SetText);

myfrm.Invoke(d, new object[] {text});

}else{

myfrm.myTxtShow.AppendText(text);

}

}

SetText(string text)方法主要实现将后台处理的每一条记录在前台主界面的文本控件myTxtShow中实时滚动显示。在该方法中,首先通过myfrm.myTxtShow.InvokeRequired属性检查前台主界面中文本控件myTxtShow所在的主线程与调用SetText方法的后台线程是否为同一线程。如果不是,则通过SetTextCallback委托前台线程调用自身SetText方法。如果是,则将字符串text内容追加到myTxtShow文本控件中。

对于程序界面中进度条控件的操作也采取相同的方式,通过委托进行处理。

5 结语

本文重点阐述了使用C#的抽象类、多线程及委托技术,对气象原始观测数据进行解析与存储、统计与分析的方法。所介绍的方法与思路,除了可以将观测数据写入Excel文件外,还可以将其写入到各类数据库如Access、MSSQL、MySQL、Oracle等,这些操作只需借助SQL语句,并在继承抽象类DataParse的子类中实现抽象方法ParseData(string gcData)即可。为了使数据解析具有更好的移植性,建议将DataParse类生成为动态链接库,这样不仅可应用于各类工程软件的开发,还可应用到网站建设等方面。

气象原始观测数据分析与处理程序作为“气象资料档案信息化系统”的子程序,较好地满足了气象数据信息化建设的需要,实现了将原始观测数据灵活、高效地存放到Excel文件和不同数据库中的功能,其所创建的DataParse动态链接库,在气象信息化网站的开发中得到充分应用,取得了良好效果。

[1] 黄春莎,朱小燕. 巧用Excel制作酸雨PH值质量控制图[J]. 贵州气象,2013,37(4):52-54.

[2] 黄世芹,王珺. VB编程环境下如何调用和生成EXCEL报表文档[J]. 贵州气象,2010,34(2):38-40.

[3] 罗福强,杨剑,张敏辉. C#程序设计经典教程(第2版)[M]. 北京:清华大学出版社,2014.

Analysis and Treatment of Meteorological Original Observation Data Based on C#

WANG Changli

(Huaihua Meteorological Automatic Station of Hunan Province,Huaihua 418008, China)

According to the actual needs of the work, all kinds of original meteorological observation data stored in text format, was analyzed and organized by means of C# technology. By defining the C# abstract class, the data analysis and data storage were effectively separated, and then the processed and analyzed data were imported into the excel files or MSSQL database, so as to achieve the purpose of "One-time analysis, On-demand storage" and meet the requirements of efficient, convenient, fast and flexible storage of observed data in different file formats. At the same time, the application of C# in processing meteorological data, and the methods for statistical analyzing them and drawing graphics by using MSChart component were introduced. The programming ideas involved in this paper has a certain reference for the analysis and processing of meteorological data.

observational data; C# technology; multithreading; abstract classes; MSChart component

1003-6598(2016)01-0045-05

2015-05-29

王长利(1971—),男,工程师,主要从事气象信息自动化工作,E-mail:yywcl@xinhuanet.com。

P466

B

猜你喜欢
整理气象解析
气象树
三角函数解析式中ω的几种求法
《内蒙古气象》征稿简则
大国气象
睡梦解析仪
美丽的气象奇观
电竞初解析
对称巧用解析妙解
高一零碎知识整理
整理“房间”