施沫寒
摘要:近年來,隨著信息技術的不斷普及,越來越多的生產單位需要-用計算機來自動統計各種生產數據。這種方法不需要過多人為干涉,具有精確度高,速度快,保存質量好,統計方便等優秀特性。為生產生活提供了極大便利,為決策制定提供了有力依據。文章將從一個實際鋼鐵企業的實際需求出發,說明如何實現一個基礎的電力數據統計程序。它將讀取電表提供的流式數據,加以糾錯和處理,最終生成方便統計人員處理查看的檔案數據文檔。該程序已經通過該企業的立項,正在實際使用中。
關鍵詞:數據統計;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++開發,使用方便,效率高,用戶反饋良好。