施沫寒
摘要:近年來,隨著信息技術(shù)的不斷普及,越來越多的生產(chǎn)單位需要-用計算機(jī)來自動統(tǒng)計各種生產(chǎn)數(shù)據(jù)。這種方法不需要過多人為干涉,具有精確度高,速度快,保存質(zhì)量好,統(tǒng)計方便等優(yōu)秀特性。為生產(chǎn)生活提供了極大便利,為決策制定提供了有力依據(jù)。文章將從一個實(shí)際鋼鐵企業(yè)的實(shí)際需求出發(fā),說明如何實(shí)現(xiàn)一個基礎(chǔ)的電力數(shù)據(jù)統(tǒng)計程序。它將讀取電表提供的流式數(shù)據(jù),加以糾錯和處理,最終生成方便統(tǒng)計人員處理查看的檔案數(shù)據(jù)文檔。該程序已經(jīng)通過該企業(yè)的立項,正在實(shí)際使用中。
關(guān)鍵詞:數(shù)據(jù)統(tǒng)計;C++
1 需求分析
眾所周知,伴隨著經(jīng)濟(jì)的快速發(fā)展用電需求的不斷攀升,分時電價作為電力需求管理的重要手段之一,而峰谷電價可有效地降低企業(yè)電能成本。北京首鋼京順軋輥有限公司使用智能型峰谷電表計量電度,電度表上下載的可以是.CSV格式的數(shù)據(jù),能夠記錄峰谷平各個時段電量信息,但不能隨時統(tǒng)計峰谷平各時段用電量及電費(fèi),使用戶感覺很不方便。計算機(jī)技術(shù)處理和保存數(shù)據(jù)已經(jīng)是信息科學(xué)的重要應(yīng)用。現(xiàn)在的數(shù)據(jù)保存早已離不開信息科學(xué)。信息科學(xué)保存數(shù)據(jù)具有方便,快速,可靠,保存時間長等特點(diǎn)。于是人們用e語言編寫電量電費(fèi)實(shí)時統(tǒng)計程序。
要實(shí)現(xiàn)的是從原始數(shù)據(jù)中提取數(shù)據(jù)并做處理。
客戶會提供電表數(shù)據(jù)。數(shù)據(jù)記錄了電表在各個時段電量(包括電流、電壓、有功功率無功功率等)的實(shí)時數(shù)據(jù)。而客戶最關(guān)心的是工廠在特定時間段所消耗的電能和花費(fèi)的電費(fèi)。一天中,電費(fèi)的計費(fèi)分峰時,谷時,平時3個時間段,谷時段電價只有峰時段電價的1/3,因此及時方便的統(tǒng)計出各個時段的用電量及電費(fèi)是企業(yè)降低生產(chǎn)成本的重要依據(jù)。
客戶提供的是一個采樣時間間隔最小5分鐘,每天24小時,累計時間30天之內(nèi)的記錄了電壓、電流、電度、功率等含有大量數(shù)據(jù)的CSV文本文件,工人的下載時間是隨機(jī)的,意味著.CSV文件中的數(shù)據(jù)量是不定的。其中數(shù)據(jù)是字符的形式,每一條目以逗號隔開,每一條記錄以換行符隔開。其中有大家關(guān)心的數(shù)據(jù),也有大家不關(guān)心的數(shù)據(jù)。由于數(shù)據(jù)量很大,要從文件中選擇所需要的數(shù)據(jù)。很多時候記錄數(shù)據(jù)并不可靠。可能會出現(xiàn)記錄缺失,亂碼。對于記錄缺失的情況,還要進(jìn)行容錯處理,可以瀏覽前后的數(shù)據(jù)給出補(bǔ)救,對于后面情況,要中斷工作,告知用戶數(shù)據(jù)有問題。
用戶有8臺大用電量設(shè)備,每個設(shè)備有一個峰谷平智能電度表,每臺設(shè)備以1-8標(biāo)示。文件名的啟用規(guī)則以年月日時間命名并含有與設(shè)備編號一致的標(biāo)號信息,便于統(tǒng)計時歸納。
企業(yè)員工文化水平較低,操作者甚至不能做計算機(jī)基本操作。做的頁面要盡量友好、方便。
2 設(shè)計
本程序由C++設(shè)計算法邏輯。
C++是著名的高級程序設(shè)計語言,支持廣泛的多種程序風(fēng)格,也無需復(fù)雜的編程環(huán)境,因此具有十分廣泛的用途。同時C++效率高,保持了C語言接近匯編語言而得來的簡潔高效,又對c語言的系統(tǒng)進(jìn)行了改革和擴(kuò)充,因此比C語言的編譯更嚴(yán)格,也更安全。
程序的受眾文化程度低,不熟悉計算機(jī)操作,本程序又采用命令行界面,要盡量使說明和操作方式友好,讓用戶容易上手。
客戶交給我們CSV文件,我們也用CSV文件輸出。這種逗號分隔的文本格式可以直接用EXCEL打開,方便用戶使用。
3 流程設(shè)計
3.1 CSV源文件定位
筆者提供給了用戶兩種方式來定位目標(biāo)文件,一個是輸入文件名時從根目錄開始輸入文件目錄的方式。這個方式靈活,可以找到磁盤任何位置的文件。但要求目錄不能輸錯,否則找不到文件無法進(jìn)行下一步,考慮到用戶文化水平較低,正確的輸入目錄可能要費(fèi)一番功夫。所以改用光標(biāo)條選擇,實(shí)現(xiàn)了遍歷文件系統(tǒng),讓用戶從列表里選擇的功能。
第二種方式是遍歷程序當(dāng)前目錄,這樣只要用戶把文件和程序放到一起,所有的.CSV文件都會以有數(shù)字編號的形式列出,用戶輸入文件名時只需輸入數(shù)字編號就可以,很方便的找到文件又便于操作者操作而不會出錯。
例如1.20150301-0302,只需輸入1就是要選的文件。
找到文件后,會回顯文件名讓用戶確認(rèn)。如果有錯返回重新輸入。
3.2 文件糾錯
由于電表數(shù)據(jù)并不完全可靠,可能會出現(xiàn)以下錯誤:
第一,可能會出現(xiàn)大片亂碼情況。對于這種情況,我們檢測文件開始的一些字符,如果正常,則可排除大部分情況,如果不正常,中斷工作。
第二,可能出現(xiàn)數(shù)據(jù)缺失。由于數(shù)據(jù)條目是累計電量,一般情況下只要用再下一條數(shù)據(jù)減去上一條數(shù)據(jù)即可。但是如果分割時間段的那條數(shù)據(jù)缺失,由于單價不同的影響,可能會影響價格的計算。這時錯誤不至于太大,程序照常執(zhí)行,但會提醒用戶可能會發(fā)生錯誤。
3.3 數(shù)據(jù)采集
每條數(shù)據(jù)中,數(shù)據(jù)項按照給定序列排列,每項數(shù)據(jù)用逗號隔開,每條數(shù)據(jù)用換行符隔開。只要簡單的循環(huán)算法,就可以提取出數(shù)據(jù)。數(shù)據(jù)存在自定義的一個數(shù)據(jù)結(jié)構(gòu)中。這個數(shù)據(jù)結(jié)構(gòu)構(gòu)成一個線性表用來管理大量數(shù)據(jù)。數(shù)據(jù)結(jié)構(gòu)全部自行實(shí)現(xiàn)。
可是由于數(shù)據(jù)較多且不可靠,長度也不定,這里的算法是程序的核心。
由于用戶給的數(shù)據(jù)條目里不僅有人們關(guān)心的數(shù)據(jù),還有人們不關(guān)心的,要自行設(shè)計算法篩選需要的數(shù)據(jù)。
3.4 數(shù)據(jù)分析和輸出
采用一邊分析一邊輸出的模式,遍歷線性表,同時累加數(shù)據(jù),到了時間段分割點(diǎn)就輸出。這個算法比較簡單。
4 實(shí)現(xiàn)
4.1 界面設(shè)計
界面設(shè)計以簡潔明了為宜,采用了控制臺方式。
4.2 CSV文件定位
通過WinAPI實(shí)現(xiàn)。主要是遍歷文件系統(tǒng),方便用戶選擇文件。當(dāng)用戶確定一個路徑后,就會列出這個路徑下的所有文件,每一個文件對應(yīng)一個索引號,用戶可以輸入多個索引號來實(shí)現(xiàn)多個文件的批次處理。主要通過FindFirstFile方法和FindNextFile用循環(huán)實(shí)現(xiàn)。這里給出關(guān)鍵的代碼。
這次遍歷用來向用戶展示文件,之后還將遍歷一次,用來存儲文件名。
4.3 數(shù)據(jù)采集
得到文件名后,通過C++的函數(shù)打開文件,得到的會是流式的文本文件。處理這些文件是程序的重點(diǎn)。
首先電表數(shù)據(jù)不一定可靠。可能會出現(xiàn)大片亂碼的情況。這時檢測每條數(shù)據(jù)的前七個字符,應(yīng)該都是數(shù)字。如果符合這個條件,則可排除這種情況。
數(shù)據(jù)還可能缺少條目。這可能會損失結(jié)果的準(zhǔn)確性。這種情況不中斷工作,只提示用戶可能出現(xiàn)錯誤。
之后就可以開始采集數(shù)據(jù)了。數(shù)據(jù)有如下特點(diǎn):
(1)每條數(shù)據(jù)第一項是日期,固定八位。
(2)第二項是時間,固定五位。
(3)第三項是累計電量。位數(shù)不定,以逗號結(jié)束。
(4)后面有若干不關(guān)心的數(shù)據(jù)項,整條數(shù)據(jù)以換行結(jié)束。
經(jīng)過分析容易知道,只要設(shè)置兩個變量,一個計算當(dāng)前條目已得到數(shù)據(jù)的數(shù)量,另一個計算當(dāng)前數(shù)據(jù)項的字符數(shù),就能從原始文件中提取符合容易做進(jìn)一步處理的字符。這里給出關(guān)鍵代碼。
現(xiàn)在已經(jīng)得到了容易處理的字符型數(shù)據(jù),只要通過簡單的循環(huán)算法把它轉(zhuǎn)換為浮點(diǎn)型,在存到線性表里就行了。這里的代碼不再贅述。
4.4 數(shù)據(jù)分析輸出
最后只要逐條數(shù)據(jù)減去上一條,乘以單價然后輸出到文件就可以了。
由于有8臺設(shè)備,每臺設(shè)備都要統(tǒng)計,最終要在一張電子表格中顯示出8臺設(shè)備各個時段的用電量及電費(fèi)情況,便于決策者統(tǒng)計管理,降低成本。設(shè)備號在客戶給出的源文件名中有標(biāo)示,在讀取時本程序已經(jīng)保存。輸出時單列出各個條目輸出即可。
5 結(jié)語
此程序基于純C++開發(fā),使用方便,效率高,用戶反饋良好。