基于C++的企业电费统计程序
施沫寒
摘要:近年来,随着信息技术的不断普及,越来越多的生产单位需要-用计算机来自动统计各种生产数据。这种方法不需要过多人为干涉,具有精确度高,速度快,保存质量好,统计方便等优秀特性。为生产生活提供了极大便利,为决策制定提供了有力依据。文章将从一个实际钢铁企业的实际需求出发,说明如何实现一个基础的电力数据统计程序。它将读取电表提供的流式数据,加以纠错和处理,最终生成方便统计人员处理查看的档案数据文档。该程序已经通过该企业的立项,正在实际使用中。
关键词:数据统计;C++
1 需求分析
众所周知,伴随着经济的快速发展用电需求的不断攀升,分时电价作为电力需求管理的重要手段之一,而峰谷电价可有效地降低企业电能成本。北京首钢京顺轧辊有限公司使用智能型峰谷电表计量电度,电度表上下载的可以是.CSV格式的数据,能够记录峰谷平各个时段电量信息,但不能随时统计峰谷平各时段用电量及电费,使用户感觉很不方便。计算机技术处理和保存数据已经是信息科学的重要应用。现在的数据保存早已离不开信息科学。信息科学保存数据具有方便,快速,可靠,保存时间长等特点。于是人们用e语言编写电量电费实时统计程序。
要实现的是从原始数据中提取数据并做处理。
客户会提供电表数据。数据记录了电表在各个时段电量(包括电流、电压、有功功率无功功率等)的实时数据。而客户最关心的是工厂在特定时间段所消耗的电能和花费的电费。一天中,电费的计费分峰时,谷时,平时3个时间段,谷时段电价只有峰时段电价的1/3,因此及时方便的统计出各个时段的用电量及电费是企业降低生产成本的重要依据。
客户提供的是一个采样时间间隔最小5分钟,每天24小时,累计时间30天之内的记录了电压、电流、电度、功率等含有大量数据的CSV文本文件,工人的下载时间是随机的,意味着.CSV文件中的数据量是不定的。其中数据是字符的形式,每一条目以逗号隔开,每一条记录以换行符隔开。其中有大家关心的数据,也有大家不关心的数据。由于数据量很大,要从文件中选择所需要的数据。很多时候记录数据并不可靠。可能会出现记录缺失,乱码。对于记录缺失的情况,还要进行容错处理,可以浏览前后的数据给出补救,对于后面情况,要中断工作,告知用户数据有问题。
用户有8台大用电量设备,每个设备有一个峰谷平智能电度表,每台设备以1-8标示。文件名的启用规则以年月日时间命名并含有与设备编号一致的标号信息,便于统计时归纳。
企业员工文化水平较低,操作者甚至不能做计算机基本操作。做的页面要尽量友好、方便。
2 设计
本程序由C++设计算法逻辑。
C++是著名的高级程序设计语言,支持广泛的多种程序风格,也无需复杂的编程环境,因此具有十分广泛的用途。同时C++效率高,保持了C语言接近汇编语言而得来的简洁高效,又对c语言的系统进行了改革和扩充,因此比C语言的编译更严格,也更安全。
程序的受众文化程度低,不熟悉计算机操作,本程序又采用命令行界面,要尽量使说明和操作方式友好,让用户容易上手。
客户交给我们CSV文件,我们也用CSV文件输出。这种逗号分隔的文本格式可以直接用EXCEL打开,方便用户使用。
3 流程设计
3.1 CSV源文件定位
笔者提供给了用户两种方式来定位目标文件,一个是输入文件名时从根目录开始输入文件目录的方式。这个方式灵活,可以找到磁盘任何位置的文件。但要求目录不能输错,否则找不到文件无法进行下一步,考虑到用户文化水平较低,正确的输入目录可能要费一番功夫。所以改用光标条选择,实现了遍历文件系统,让用户从列表里选择的功能。
第二种方式是遍历程序当前目录,这样只要用户把文件和程序放到一起,所有的.CSV文件都会以有数字编号的形式列出,用户输入文件名时只需输入数字编号就可以,很方便的找到文件又便于操作者操作而不会出错。
例如1.20150301-0302,只需输入1就是要选的文件。
找到文件后,会回显文件名让用户确认。如果有错返回重新输入。
3.2 文件纠错
由于电表数据并不完全可靠,可能会出现以下错误:
第一,可能会出现大片乱码情况。对于这种情况,我们检测文件开始的一些字符,如果正常,则可排除大部分情况,如果不正常,中断工作。
第二,可能出现数据缺失。由于数据条目是累计电量,一般情况下只要用再下一条数据减去上一条数据即可。但是如果分割时间段的那条数据缺失,由于单价不同的影响,可能会影响价格的计算。这时错误不至于太大,程序照常执行,但会提醒用户可能会发生错误。
3.3 数据采集
每条数据中,数据项按照给定序列排列,每项数据用逗号隔开,每条数据用换行符隔开。只要简单的循环算法,就可以提取出数据。数据存在自定义的一个数据结构中。这个数据结构构成一个线性表用来管理大量数据。数据结构全部自行实现。
可是由于数据较多且不可靠,长度也不定,这里的算法是程序的核心。
由于用户给的数据条目里不仅有人们关心的数据,还有人们不关心的,要自行设计算法筛选需要的数据。
3.4 数据分析和输出
采用一边分析一边输出的模式,遍历线性表,同时累加数据,到了时间段分割点就输出。这个算法比较简单。
4 实现
4.1 界面设计
界面设计以简洁明了为宜,采用了控制台方式。
4.2 CSV文件定位
通过WinAPI实现。主要是遍历文件系统,方便用户选择文件。当用户确定一个路径后,就会列出这个路径下的所有文件,每一个文件对应一个索引号,用户可以输入多个索引号来实现多个文件的批次处理。主要通过FindFirstFile方法和FindNextFile用循环实现。这里给出关键的代码。
这次遍历用来向用户展示文件,之后还将遍历一次,用来存储文件名。
4.3 数据采集
得到文件名后,通过C++的函数打开文件,得到的会是流式的文本文件。处理这些文件是程序的重点。
首先电表数据不一定可靠。可能会出现大片乱码的情况。这时检测每条数据的前七个字符,应该都是数字。如果符合这个条件,则可排除这种情况。
数据还可能缺少条目。这可能会损失结果的准确性。这种情况不中断工作,只提示用户可能出现错误。
之后就可以开始采集数据了。数据有如下特点:
(1)每条数据第一项是日期,固定八位。
(2)第二项是时间,固定五位。
(3)第三项是累计电量。位数不定,以逗号结束。
(4)后面有若干不关心的数据项,整条数据以换行结束。
经过分析容易知道,只要设置两个变量,一个计算当前条目已得到数据的数量,另一个计算当前数据项的字符数,就能从原始文件中提取符合容易做进一步处理的字符。这里给出关键代码。
现在已经得到了容易处理的字符型数据,只要通过简单的循环算法把它转换为浮点型,在存到线性表里就行了。这里的代码不再赘述。
4.4 数据分析输出
最后只要逐条数据减去上一条,乘以单价然后输出到文件就可以了。
由于有8台设备,每台设备都要统计,最终要在一张电子表格中显示出8台设备各个时段的用电量及电费情况,便于决策者统计管理,降低成本。设备号在客户给出的源文件名中有标示,在读取时本程序已经保存。输出时单列出各个条目输出即可。
5 结语
此程序基于纯C++开发,使用方便,效率高,用户反馈良好。