揚州大學 王勇
院校子系統導出的投檔單是高校獲得的第一手新生信息,但不同省份使用的版本導出投檔單中專業志愿數據存在差異。本文通過分析導出院校投檔單中專業志愿數據的差異,分別提出了借助VFP程序和Excel函數來解決數據差異的處理策略。通過實踐證明,運用此策略可以巧妙解決問題,便于形成統一規范的基礎錄取數據庫。
從2001年普通高校招生全面實施網上錄取以來,由教育部組織的全國普通高校招生網上錄取課題組開發研制的網上錄取系統功能強大,界面友好,高效可靠,同時從其院校子系統導出的投檔單(可分別為dBaseⅣ文件(.dbf)或excel文件(*.xls)兩種類型)也為各錄取高校個性化的后續工作提供了基礎電子數據。自2017年高考改革開始后,改革省份和未改革省份需要使用不同版本的網上錄取系統實施網上錄取,各版本院校子系統導出的投檔單文件也略有差異。以2021年普通高校招生網上錄取為例,分別使用了2012SP3版和2020R2版院校子系統,2012SP3版院校子系統導出的投檔單有24張表(信息庫6張、代碼庫18張)[1],2020R2版院校子系統導出的投檔單有43張表(信息庫9張、代碼庫34張)[2],dBaseⅣ文件(.dbf)為24個或43個單獨文件,excel文件(*.xls)為一個工作簿(內含24或43張表)。兩種版本投檔單中有些表雖然表名一樣,但其中的字段和結構卻有所差異。為整合各省錄取數據形成院校基礎錄取數據庫帶來困難。為便于高校內各職能部門在后續工作中的使用,就需對網上錄取院校子系統導出的投檔單進行統一規范的數據處理,其中考生的專業志愿數據是專業評估、計劃編制的重要依據。本文就2020R2版和2012SP3版院校子系統導出投檔單考生專業志愿的數據差異進行統一處理提供了解決策略,同時對于其他具有相似類型信息差異的數據統一處理也有借鑒作用。
2012SP3版院校子系統導出的投檔單中考生的專業志愿數據項在T_TDD表里,含多項字段數據,本文僅取與專業志愿有關字段進行說明。每位考生一行數據,KSH(考生號)唯一,考生專業志愿從字段ZYDH1(專業代號1)到字段ZYDH6(專業代號6)橫向排列,各省ZYDH按省份不同有兩位字符或三位字符之分。如圖1所示。

圖1 2012SP3專業志愿數據項(字段)Fig.1 2012SP3 professional volunteer data items (fields)
2020R2版院校子系統導出的投檔單中考生的專業志愿數據項在T_zykmx表里,如圖2所示。

圖2 2020R2版專業志愿數據項(字段)Fig.2 2020R2 version of professional volunteer data items (fields)
KSH(考生號)行數不定,考生有幾個專業志愿就有幾行數據,最多為6。考生專業志愿按序號縱向排列,即同一KSH(考生號)下ZYXH(專業序號)為1的ZYDH(專業代號)是專業志愿1,依次類推,直到ZYXH(專業序號)為6的ZYDH(專業代號)是專業志愿6。
兩種版本院校子系統導出的投檔單從專業志愿數據看,顯然無法進行直接合并,只有經過數據規范處理后,使2020R2版和2012SP3版投檔單字段結構形式統一,才能對dBaseⅣ文件(.dbf)使用數據追加命令進行合并,對excel文件(*.xls)使用復制-粘貼的方法形成合并總庫。
解決思路是首先通過VFP修改表結構命令ALTER TABLE在T_TDD文件(.dbf)中增加相關字段,包含ZYDH1(專業代號1)到ZYDH6(專業代號6),然后選擇打開T_TDD和T_zykmx兩文件,利用指針循環語句SCAN…ENDSCAN將T_zykmx文 件 中 的zydh從第一條記錄開始,直到最后一條記錄分別按KSH(考生號)及ZYXH(志愿序號)替換到T_TDD文件中的相對應KSH的ZYDH1到ZYDH6中后結束。
專業志愿替換的VFP程序代碼如下(假設導出投檔單文件在D盤daochu文件夾)[3];
set default to D:daochu

2020R2版導出的T_TDD文件在運行此VFP程序后,專業志愿的數據結構就和2012SP3導出的TDD文件專業志愿的數據結構一致,每位考生一行數據,考生專業志愿從字段ZYDH1(專業代號1)到字段ZYDH6(專業代號6)橫向排列。處理后的各省份各批次數據就可以直接利用數據追加命令(APPEND FROM……)即可形成合并總庫。
解決思路是先將TDD工作薄中的t_zykmx表中豎向排列的各考生志愿專業代號,利用Excel函數公式按KSH(考生號)將考生的所有ZYXH(志愿序號)下的ZYDH(專業代號)合并為一個字符串,這樣每個KSH就只對應一個專業代號合并字符串,解決了表中KSH數據行數不定問題,再在T_TDD表中利用Excel函數公式按KSH將t_zykmx表中合并后的字符串中的不同位數的字符跨表填入T_TDD表相應專業代號(zydh1-zydh6)中。
具體解決方案如下:假設該省導出投檔單含23位考生信息,ZYDH(專業代號)為3位字符。
首先在T_TDD表中增加相關字段列,包含ZYDH1到ZYDH6,然后在t_zykmx表中增加相關字段列,I列(KSH1(考生號1)),J列(ZYDHHB(專業代號合并))。將A列數據選擇后“復制-選擇性粘貼-值”粘貼到I列中。選擇I列數據,然后點擊“數據-刪除重復項”,注意要勾選“以當前選定區域排序”,再點擊刪除重復項按鈕,就可以在I列中保留KSH的唯一值并按KSH排序。在J2單元格輸入“=PHONETIC(OFFSET(A$1,MATCH(I2,A:A,0)-1,6,COUNTIF(A:A,I2),1))”后 回車,然后拖動J2單元格右下角填充柄下拉填充到KSH1列數據末行,復制J列數據選擇性粘貼為值,就可以按KSH得到每位考生的志愿專業代號相連的字符串。
在這里用到了連接文本函數PHONETIC,引用函數OFFSET,查找函數MATCH,條件計數函數COUNTIF[4]。以J2單元格為例,“COUNTIF(A:A,I2)”計算出考生號是I2單元格的值(21*********031)在A列出現的行數,同樣也是這個考生號專業序號的最大數,是2,說明這個考生有zydh1-zydh2,zydh3-zydh6為 空。“MATCH(I2,A:A,0)”計算出考生號是I2值的KSH的在A列出現的最小行,是第2行。“OFFSET(A$1,MATCH(I2,A:A,0)-1,6,COUNTIF(A:A,I2),1)”得出以A$1單元格為參照系,向下移動1行向右移動6列得到的2行1列單元格區域(G2:G3),即考生號為I2單元格值的考生的兩個專業代號“002”、“001”所在區域。“PHONETIC(OFFSET (A$1,MATCH(I2,A:A,0)-1,6,COUNTIF(A:A,I2),1))”將所得區域(G2:G3)各單元格的文本合并,得到合并字符串“002001”。J列其他各個單元格通過合并相應的不同單元格區域得到和KSH對應的合并字符串,如圖3所示。

圖3 獲得考生專業志愿代號合并字符串Fig.3 Obtaining the combined string of the candidate's professional volunteer code
在ZYDHHB字段列每個考生按KSH(考生號)得到的一串字符,對應專業代號是兩個字符,則字符串的1-2位是專業志愿1、字符串的3-4位是專業志愿2、……字符串的11-12位是專業志愿6,對應專業代號是三個字符,則字符串1-3位是專業志愿1、字符串的4-6位是專業志愿2、……字符串的16-18位是專業志愿6。
在T_TDD表的B2單元格輸入“=LEFT(VLOOKUP(T_TDD! A2,t_zykmx!$I$1:$J$24,2,0),3)”,得到在查找區域t_zykmx表$I$1:$J$24區域中查找值是T_TDD!A2的值一樣并返回第2列(J列)中單元格文本字符串從第1個到第3個字符,即zydh1的3個字符。
在C2單元格輸入“=MID(VLOOKUP(T_TDD!A2,t_zykmx!$I$1:$J$24,2,0),4,3)”,得到zydh2的3個字符。
在D2單元格輸入“=MID(VLOOKUP(T_TDD!A2,t_zykmx!$I$1:$J$24,2,0),7,3)”,得到zydh3的3個字符。
在E2單元格輸入“=MID(VLOOKUP(T_TDD!A2,t_zykmx!$I$1:$J$24,2,0),10,3)”,得到zydh4的3個字符。
在F2單元格輸入“=MID(VLOOKUP(T_TDD!A2,t_zykmx!$I$1:$J$24,2,0),13,3)”,得到zydh5的3個字符。
在G2單元格輸入“=MID(VLOOKUP(T_TDD!A2,t_zykmx!$I$1:$J$24,2,0),16,3)”,得到zydh6的3個字符。
在分別得到A2單元格考生號的6個專業志愿代號(zydh1~zydh6)后,選擇B2到G2,拖動填充柄下拉完成自動填充,得到每個考生號的相應專業志愿代號(zydh1~zydh6)。
使用VLOOKUP函數要注意查找區域引用方式和查找方式是精確匹配還是大致匹配,否則容易出現錯誤[5]。因為此例查找區域已排序,所以使用了大致匹配。如圖4所示。

圖4 獲得考生各個專業志愿代號(橫向排列)Fig.4 Obtaining the volunteer code of each major of the candidates (horizontal arrangement)
再選擇ZYDH1到ZYDH6區域,在本區域“復制-選擇性粘貼-值”,完成專業志愿數據結構形式和2012SP3版一致的轉換,以后就可直接使用復制-粘貼方法形成合并總庫。
如果各個省份各個批次導出投檔單考生人數不同,ZYDH(專業代號)字符數不同,在Excel函數公式里修改相應參數后就可以完成專業志愿數據結構形式的處理。
雖然使用VFP程序以及Excel函數都可以解決專業志愿數據差異的處理問題,但是從使用VFP程序以及Excel函數的處理過程來看,將dBaseⅣ文件(.dbf)利用VFP程序進行數據處理,人為操作少,更為方便快捷,明顯可以提高工作效率,但是對于部分對于VFP程序不熟悉,習慣于使用Excel的用戶來說,利用Excel函數的強大功能也能夠解決工作中的實際問題。
引用
[1] 清華大學計算機系.全國普通高校招生網上錄取系統使用手冊(院校端系統)[Z].教育部高校學生司,2008.
[2] 清華大學計算機系.全國普通高校招生網上錄取系統院校系統(2020版)使用手冊[Z].教育部高校學生司,2021.
[3] 孫淑霞,李思明,劉煥軍,等,編著.Visual FoxPro 6.0 程序設計教程(第4版)[M].北京:電子工業出版社,2013.
[4] 黃照鶴.Excel函數速查手冊[M].北京:化學工業出版社, 2011.
[5] 宋翔編.Excel公式與函數大辭典[M].北京:人民郵電出版社, 2010.