張國強(qiáng),李 響,姚海燕
(安陽工學(xué)院,河南安陽455000)
高等學(xué)校實(shí)驗(yàn)室信息統(tǒng)計(jì)檢測上報(bào)系統(tǒng)(以下簡稱上報(bào)系統(tǒng)),用于高等院校每年向國家教育部上報(bào)數(shù)據(jù)的校驗(yàn)、審核、報(bào)表打印和網(wǎng)上傳送,是一個(gè)設(shè)備信息管理的數(shù)據(jù)庫管理系統(tǒng)。按照操作說明系統(tǒng)運(yùn)行環(huán)境中對(duì)客戶端的說明原文是“Windows 98/Xp/2000/2003 以上,所用機(jī)器能上Cernet 網(wǎng)”。而目前,大多數(shù)電腦的運(yùn)行環(huán)境是win7或win8,這就存在著兼容性的問題。
上報(bào)系統(tǒng)中提交數(shù)據(jù)時(shí)追加來源對(duì)話框如圖1所示。從追加數(shù)據(jù)支持的文件格式就可以看出,它所支持的文件有些已經(jīng)可以用古老來形容了。例如Excel版本是5.0,而我們現(xiàn)在使用的電腦安裝的Excel版本都是2003以上的版,有的已經(jīng)在使用2013版。又例如Table(DBF)連VFP6.0的表文件竟然也不能兼容。
關(guān)于數(shù)據(jù)庫的軟件有很多,而大多數(shù)人掌握的還是Excel,而各個(gè)部門的情況也不一樣,安裝的Excel 版本也是各種各樣。所以在進(jìn)行匯總時(shí),我們是不能直接導(dǎo)入上報(bào)系統(tǒng)的。
由于學(xué)校各個(gè)部門和實(shí)驗(yàn)室很多,表中的字段在存儲(chǔ)的時(shí)候,沒有嚴(yán)格按照上報(bào)系統(tǒng)規(guī)定的數(shù)據(jù)寬度來進(jìn)行限制。實(shí)際上使用Excel 的話,嚴(yán)格按照指定的寬度來進(jìn)行限制是難以完成的。這就導(dǎo)致除了文件格式的問題,還有數(shù)據(jù)寬度的問題都需要解決。
在上報(bào)系統(tǒng)中,對(duì)字段的數(shù)據(jù)寬度做了限制,其中字段的名稱、數(shù)據(jù)類型和數(shù)據(jù)長度的具體要求如表1所示。在實(shí)際的文件中,“儀器名稱”、“型號(hào)”、“規(guī)格”三個(gè)字段均有部分記錄超出了規(guī)定的長度。
表1 字段屬性
上報(bào)系統(tǒng)可以支持Excel 格式的文件導(dǎo)入,但最高只能支持Excel5.0版本的文件。而Excel5.0的文件系統(tǒng)只能支持16000 多條記錄。而實(shí)際文件的記錄數(shù)目超出了這個(gè)上限。保存為5.0版本后,缺少了部分記錄。這樣,用簡單的“另存為”已經(jīng)不能完成任務(wù)了。
對(duì)付舊版本的軟件,還需要用低版本的軟件來對(duì)付。在處理數(shù)據(jù)到正確上傳過程中,除了用來匯總文件的一臺(tái)電腦安裝的Excel 2013外,還使用了另一臺(tái)電腦。該電腦使用的操作系統(tǒng)為Windows XP,安裝的軟件分別有Access 2003 和VFP6.0。因?yàn)镋xcel 和Access 都是微軟公司的辦公軟件Microsoft office 的組件,而同一臺(tái)電腦無法同時(shí)安裝兩個(gè)不同版本的Office,所以必須用兩臺(tái)電腦完成。使用Access 2003 主要是用它來把Excel2003 的文件轉(zhuǎn)換成適合VFP 處理的DBF 文件。當(dāng)然VFP6.0也可以直接導(dǎo)入Excel文件,但在導(dǎo)入時(shí),對(duì)Excel文件的兼容性不如Access,且有些文件直接導(dǎo)入VFP會(huì)出現(xiàn)失敗。經(jīng)過一段時(shí)間的研究和嘗試,把匯總好的2013版的Excel文件,最后生成可以導(dǎo)入上報(bào)系統(tǒng)的文件,大致總結(jié)了4個(gè)步驟。
將Excel 文件另存為2003 兼容格式,使用Access 2003 導(dǎo)入excel 文件,并導(dǎo)出為dBASE5 文件格式。
長度超過限制的字段主要來源于“儀器名稱”、“型號(hào)”、“規(guī)格”等字段。對(duì)于數(shù)萬條記錄,如果靠人工重新歸納數(shù)據(jù)字符表達(dá)的含義,是非常煩瑣的一件事情。另外,系統(tǒng)中規(guī)定的數(shù)據(jù)長度不是很短,前面的字符大致可以看出數(shù)據(jù)表達(dá)的重要信息。所以對(duì)于超出長度的數(shù)據(jù),采用刪除尾部字符的方法截取數(shù)據(jù)。在VFP6.0 中,限制字符寬度是比較容易的,只需打開dBASE5 文件,按照表1修改表結(jié)構(gòu),就可以將數(shù)據(jù)長度截短。
因?yàn)槲臋n中的數(shù)據(jù)是由中文、英文、數(shù)字和標(biāo)點(diǎn)等字符混合組成的,其中英文、數(shù)字和英文的標(biāo)點(diǎn)符號(hào)占一個(gè)寬度,漢字和中文的標(biāo)點(diǎn)符號(hào)占2個(gè)寬度,所以在長度截短后,會(huì)出現(xiàn)半個(gè)漢字或半個(gè)中文標(biāo)點(diǎn)的問題。例如:第2611條記錄,型號(hào)的內(nèi)容為“Freescale Cortex-A9系列”,前面英文、數(shù)字和“-”符號(hào)的部分“Freescale Cortex-A9”,包括中間一個(gè)空格長度為19,截取20個(gè)長度,正好把緊挨的“系”字截去一半。雖然在VFP 中,截去的半個(gè)漢字不顯示,但在用上報(bào)系統(tǒng)提交時(shí),會(huì)被檢測到,導(dǎo)致審核不能通過。如果截去的是半個(gè)中文標(biāo)點(diǎn),情況和半個(gè)漢字是一樣的。因此,需要把最后出現(xiàn)半個(gè)漢字或半個(gè)標(biāo)點(diǎn)的情況,再減少一個(gè)長度,使之長度為19。數(shù)據(jù)中的半個(gè)漢字可能是任意一個(gè)漢字的一半,VFP 中沒有這樣的函數(shù),可以檢測一個(gè)字符是否為半個(gè)漢字。但有可以檢測字符是否為前導(dǎo)字節(jié)的函數(shù)ISLEADBYTE(),該函數(shù)可以判斷字符是否是雙字節(jié)字符。如果字符的第一個(gè)字節(jié)是前導(dǎo)字節(jié),那么字符是雙字節(jié)字符,否則字符是單字節(jié)字符。判斷最后一個(gè)字符是否為半個(gè)漢字或半個(gè)中文標(biāo)點(diǎn),可以通過判斷是否為雙字節(jié)字符的前導(dǎo)字節(jié)的方法,使用該函數(shù)判斷最后一個(gè)字符是否為雙字節(jié)字符的前導(dǎo)字節(jié)。如果是就刪除最后一個(gè)字符,使其變?yōu)榭崭瘛?/p>
但在實(shí)際使用過程中,發(fā)現(xiàn)ISLEADBYTE()對(duì)于漢字的后半部分,檢測的結(jié)果也為真。就是意味著,即使最后一個(gè)字符是完整的漢字,也會(huì)和半個(gè)漢字的情況一樣,函數(shù)返回值為真,即最后一個(gè)是半個(gè)漢字還是一個(gè)完整的漢字是沒有辦法用該函數(shù)區(qū)分的。編程思路調(diào)整為用ISLEADBYTE()函數(shù)檢測最后一個(gè)字符,不管是完整的漢字還是半個(gè)漢字都刪掉。長度超過限制的字段主要來源于“儀器名稱”、“型號(hào)”、“規(guī)格”等字段。對(duì)于這些長度超過限制需要截短的字符來說,其意義已經(jīng)不能非常完整的表達(dá),但前面的字符應(yīng)該基本可以體現(xiàn)其主要的含義,后面的字符多一個(gè)或者少一個(gè),對(duì)于表達(dá)的意義已經(jīng)影響不大,所以這種方法也是可行的。所以在選取字符進(jìn)行判斷時(shí),使用了rightc()函數(shù)。該函數(shù)從一個(gè)字符表達(dá)式中返回最右邊指定數(shù)目的字符。字符表達(dá)式可以包含單字節(jié)和雙字節(jié)的任意組合。而比較常用的right()函數(shù),只返回單字節(jié)的表達(dá)式。刪除最后一個(gè)字符是用的是leftc()函數(shù)和lenc()函數(shù)。這些帶c的函數(shù)和rightc()函數(shù)效果相似。
具體程序如下:
scan for ISLEADBYTE(rightc(儀器名稱,1))
repl 儀器名稱with leftc(儀器名稱,(lenc(儀器名稱)-1))
endscan
刪除其他字段的程序和上述程序一樣,把字段名改一下即可,不再一一列出。
上傳系統(tǒng)支持的導(dǎo)入文件類型如圖1 所示。其中Table(DBF)就是VFP 表文件的格式。但是VFP6.0的表文件導(dǎo)入以后,數(shù)據(jù)全部空白,說明系統(tǒng)對(duì)VFP6.0的表文件也不兼容。VFP6.0文件導(dǎo)出支持的格式如圖2 所示。其中DIF 文件一種可進(jìn)行數(shù)據(jù)互換的電子表格,兼容性較好,且上報(bào)系統(tǒng)也支持該格式文件,所以最后選擇了“Data Interchange Format(DIF)”格式的文件導(dǎo)出。最終上報(bào)審核成功。
當(dāng)然,Excel和Access也都是數(shù)據(jù)庫軟件,可以對(duì)數(shù)據(jù)進(jìn)行處理。之所以選擇使用VFP,主要原因是VFP 支持的數(shù)據(jù)格式與上報(bào)系統(tǒng)相似度最高,而數(shù)據(jù)導(dǎo)入導(dǎo)出是最容易出現(xiàn)兼容性問題的關(guān)鍵一步。如果數(shù)據(jù)處理好了,但是因?yàn)楦袷降脑虿荒軐?dǎo)入,將會(huì)前功盡棄,最后不得不更換軟件再重新處理。為了確保該提交數(shù)據(jù)方案的通用性,數(shù)據(jù)處理的過程較為煩瑣。另外,Excel2013 是向下兼容的,所以2013版的文件可以成功上報(bào),低版本的文件也是可以的。在實(shí)際的使用中,可以對(duì)有些步驟進(jìn)行精簡,至于如何精簡,需要具體問題具體分析,這里也不能一一列舉了。
[1]李亮輝.Excel 應(yīng)用技巧與實(shí)戰(zhàn)[M].北京:清華大學(xué)出版社,2015.
[2]崔洪芳.Access 數(shù)據(jù)庫應(yīng)用技術(shù)[M].北京:清華大學(xué)出版社,2014.
[3]蔡洪濤,曾羲梅,李茜.Visual FoxPro 程序設(shè)計(jì)實(shí)踐教程[M].北京:科學(xué)出版社,2014.