網路的迅速發展,讓網上考試替代了傳統筆試考試。而網上考試所用的考題都是需要我們寫入的,可考題並不是一條幾十條那麼簡單,所以我們需要批量的上傳。上傳考題比較特殊,因為它並不像**資料那樣精簡,而且格式不一,所以需要用word檔案進行上傳。上傳,通過一些特殊的處理將檔案以html的樣式顯示到頁面上再進行儲存。上傳過程複雜,而儲存過程同樣複雜,下面我將對儲存的流程進行分析:
試題儲存的主要流程分為五個大塊,首先對試題的模組進行分割,分出每一道試題,將這些試題以陣列的形式放到乙個變數中;其次是對這些試題進行處理,分出每個試題的每乙個模組再以陣列的形式存放到乙個變數中;然後是去除重複的試題,先去除掉所上傳試題中重複的試題,然後再去除掉所上傳試題在資料庫中已存在的試題;再對題目中的進行處理,找到所含的試題將其中的通過正則處理儲存到指定路徑;最後對處理好的資料進行儲存,將篩選出的可以儲存的試題進行儲存操作,同時返回乙個提示(****於老師)。
首先要關閉危險字元的驗證,因為在上傳資料的時候會進行加密,傳輸加密的資料就是一堆亂碼,亂碼就會有一些危險字元就會報錯(比如、$、%、#等這些字元),同時不會傳輸過來資料。
一、 分割試題
例項化乙個工具類,將方法寫在try…catch內,用作捕捉錯誤。判斷所傳引數是否為空,如果為空則返回乙個文字提示資料填寫不完整,當資料完整的情況下將進行試題的分割。
所上傳的資料是已經加密的資料,所以在分割前需要先將亂碼進行解碼操作。這裡加密使用了url編碼的方法進行加密,urldeconde()方法是對url編碼的字串進行解碼,並返回解碼成功的字串。
通過正規表示式匹配到字串中所有的空格和a標籤,然後使用replace()方法將空格和a標籤替換為空,達到移除字串中所有空格和a標籤,然後匹配到每個答案選項,並在每個答案前加上兩個「 ~~ 」符號。
建立存放每個塊的list型別的變數、成功資料和錯誤資料的變數,然後匹配到以「題型:」開始以兩個br換行符結束的字串以陣列形式存放在乙個變數內,所匹配到的每一條資料就是每一題的資料。
使用for迴圈方法迴圈遍歷這個陣列(matchs),獲取到每一條資料並同時對每一條資料進行下一步的處理。
再包裹乙個try…catch方法,當執行出錯時便將試題內的~~符號去除掉然後儲存到之前建立用來存放錯誤資訊的變數中。使用正規表示式匹配出「題型:」將匹配出的每一道題內的這幾個字去除掉,然後用split()將每一的題目型別、難度係數、適用單位、知識點、題幹、答案全部分割出來並以陣列的形式將每個部位進行存放。
例項化正規表示式,通過這個變數獲取出題型、難度係數、知識點,然後將每一道題中的換行符br移除掉,合併題幹選項,之後再通過add()方法將獲取匹配到的值儲存到之前建立的乙個變數中。
在設計時對答案選項設定了上限(a-f),這裡還需用正規表示式驗證一下答案是否超過這個範圍,然後將它存放到之前建立用來存放答案的變數中,最後將能成功新增的試題以陣列形式存放到之前建立用來存放正確試題的變數中。
二、 試題處理
經過上一步的處理已經分出了每一道題,但是在題庫中有各種題型,就需要進行題型分類。在上面所分好的試題你並不知道它到底是哪一類的題型,所有就需要對試題進一步處理。
是哪一類題,事先就要知道題庫裡有哪些型別。查詢出資料庫中的題目型別、難度係數、知識點、適用單位,然後例項化建立乙個變數,用來存放處理好的試題。由於重複**頻繁,只摘選幾條為例。
迴圈遍歷存放題目型別的陣列變數,然後還是用乙個try…catch方法進行包裹再寫**。例項化建立乙個用來存放試題的變數,查詢出試題的題目資訊、題目型別、難度係數、知識點、適用單位,然後將這些對應的資料賦值給這個變數中對應字段,最後將這個變數儲存到事先建立用作存放已處理好的資料的變數中。
三、 重複試題
試題已經處理完成,接下來就需要判斷你所上傳的試題有沒有重複的,如果有重複的試題就不能進行上傳。在與題庫內的試題進行對比時會有很多次的對比,為了避免那些不必要的操作,就把這部分分為兩部分,一部分先在所上傳的試題內自行對比去除重複試題,完成後再與題庫進行對比去除重複試題。
上傳試題中去重複
例項化建立乙個同型別用來存放不重複試題的變數,通過foreach迴圈遍歷存放已處理完成試題的這個物件,然後判斷一下所迴圈的是不是第一題,如果是第一題則直接將它新增到變數中,因為第一題本身重複的機率就是為0的,至於為什麼為0就不用我多說。
建立乙個bool型別的變數判斷試題是否不為空,並預設賦值為true,就是真的不存在,再用乙個foreach迴圈遍歷這個不包含第一題的物件,判斷所對應的那些值是否相同,如果相同則返回bool值為false,表示不是不存在,代表該資料是重複的,然後跳出當前迴圈,如果bool值為true則將該數進行儲存。
對應題庫去重複
首先查詢出題庫中所有的資料然後再將上傳不重複的試題與之對比出是否有相同資料,不同的資料還需要建立乙個變數進行接收。迴圈遍歷上傳不重複的試題物件,去除題幹中的,因為可以相同但題目絕對不能相同。然後再建立乙個bool變數判斷試題是否存在有相同。
再迴圈遍歷整個題庫,同樣的方法去除掉題幹中的,然後與上傳試題對比,相同則跳出當前迴圈,不相同則以陣列形式儲存到建立存放最終可上傳試題的變數中。
四、 處理
迴圈遍歷這個陣列,然後查詢出題幹的,初始化路徑,篩選出只含有的試題,獲取到路徑,將所有的「\」替換為「/」然後 拼接路徑為本地臨時存放路徑。同樣的方法獲取到最終存放的路徑。將試題中路徑更換為最終儲存路徑,最後將臨時移動到最終資料夾內。
五、 儲存試題
最後儲存操作很簡單,將處理完成的允許上傳的試題儲存到資料庫,然後返回乙個記錄資料的文字提示。
Word檔案修復
word 文件是許多電腦使用者寫作時使用的檔案格式,當您辛辛苦苦寫完一篇word文件後,發現它因損壞而無法開啟時,一定非常著急。其實,您不必心焦,因為我們還是有一些方法可以修復損壞文件,恢復受損文件中的文字。下面是具體的步驟。1 採用專用修復功能 在 檔案 選單上,單擊 開啟 在 查詢範圍 列表中,...
Word檔案修復
word 文件是許多電腦使用者寫作時使用的檔案格式,當您辛辛苦苦寫完一篇word文件後,發現它因損壞而無法開啟時,一定非常著急。其實,您不必心焦,因為我們還是有一些方法可以修復損壞文件,恢復受損文件中的文字。下面是具體的步驟。1 採用專用修復功能 在 檔案 選單上,單擊 開啟 在 查詢範圍 列表中,...
C 根據Word模版生成Word檔案
指定的word模版 2,生成word類 新增com microsoft word 11.0 object library 引用 usingsystem usingsystem.collections.generic usingsystem.data usingsystem.windows.forms...