韓愛慶+王允亮+李軍祥+劉敏+唐燕+翟興+文占權
摘要:對醫(yī)案實施統計分析或數據挖掘是進行癥一證一藥規(guī)律研究的有效方法。在實施統計分析或數據挖掘之前,必須對數據實施預處理。該文列舉了兩類典型的中醫(yī)電子醫(yī)案數據存儲不規(guī)范問題,基于數據庫范式指出了問題的解決方法,給出了對應的解決算法,并使用VBA進行了程序實現。
關鍵詞:中醫(yī)電子醫(yī)案;數據處理;VBA 對臨床中醫(yī)醫(yī)案實施統計分析或數據挖掘是發(fā)現和總結醫(yī)生臨證思維和用藥規(guī)律的有效方法--,。在實施統計分析或數據挖掘之前,必須對數據實施預處理,要求預處理結果滿足數據庫第三范式,這項工作耗時費力,在總的數據處理工作中占有較大比重。然而在實際的課題研究或醫(yī)案分析中發(fā)現,有很多原始電子醫(yī)案數據甚至是不滿足第一范式的。由于Office辦公系統的普及性,原始電子醫(yī)案數據多存儲在Excel文件或Ac-cess數據庫中,而Excel數據和Access數據可通過導入導出或另存的方式互相轉換,如何用一種簡潔高效的辦法在Excel軟件中將原始醫(yī)案數據進行預處理,充分發(fā)揮Excel普及性好,易學易用的優(yōu)勢,是一個值得研究的課題?;赩BA的數據處理或預處理已經已經在很多領域有成熟的應用,通過文獻研究和實踐操作發(fā)現,借助Excel VBA可以很好地解決電子醫(yī)案數據預處理問題。
1問題描述 原始電子醫(yī)案數據大多不符合數據庫設計要求,圖1所示的數據存儲結構是常見的錯誤結構之一。其中,每個患者的癥狀都是以堆積的形式作為整體存儲在癥狀列中,藥物信息則按照處方中藥物數量依次以藥物1、藥物2、藥物3……的布局在橫向展開,如圖1所示。 所謂第一范式(1NF)是指數據庫表的每一列都是不可分割的基本數據項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重復的屬性。如果出現重復的屬性,就可能需要定義一個新的實體,新的實體由重復的屬性構成,新實體與原實體之間為一對多關系。此例中的癥狀屬性從字段標題來看是滿足第一范式的,但從字段內容來看并不符合要求,需將每個癥狀值拆分為最小信息單元,如圖3(a)所示。由于藥物1、藥物2等信息同屬藥名信息,需要將圖1中藥物進行轉置處理,轉置后如圖所示。
2 Excel VBA及Excd對象模型
VBA(Visual Basic for Application)是開發(fā)Excel應用程序的編程語言,也是內嵌于其他Office套件的應用程序開發(fā)語言。VBA的主要任務是組織或集合Office程序的功能,雖然它無法脫離Office環(huán)境獨立運行,但卻在自動化工作進程、個性化工作界面等方面有著內在的優(yōu)勢。作為Excel中的程序語言,由于Excel自身強大的數據分析與處理功能,使得Excel VBA具有更廣泛的應用前景。與所有其他編程語言一樣,VBA編程語言也是由類型、變量、數組、函數和流程控制等基本元素組成。在Office編程環(huán)境下,所有VBA代碼都位于模塊中,模塊是存儲VBA代碼的容器。模塊有三種類型:對象模塊、標準模塊和類模塊。其中,對象模塊是包含對象專用代碼的模塊,如工作表模塊和工作簿模塊;標準模塊用于存儲公用的,共享代碼的模塊;類模塊則可以實現基于對象的編程,創(chuàng)建自己的屬性、方法和事件。
3數據預處理過程
原始醫(yī)案數據往往比圖1所示的數據要復雜得多,主要問題包括中英文標點符號不一致,如有的分隔符是中文逗號,有的是英文逗號,有的則是空格;其他問題包括多余標點(如尾部),信息重復以及信息殘缺等等。因此,在實施正式數據預處理之前,需要先統一分隔符、去除多余標點、刪除重復信息、修復或刪除殘缺信息等等,之后才能實施數據預處理。
3.1癥狀數據的數據預處理算法 癥狀數據預處理的主要算法思想是,逐行遍歷圖1所示的記錄,使用函數將癥狀信息以逗號為分隔符進行切割并將其存儲到數組中,遍歷數組并將其存儲到新表中。具體算法如下: 第1步:新建工作簿,并設置目標區(qū)域列標題。 第2步:設置整型變量i=2。從第2行開始逐行遍歷癥狀。 第3步:當i=k(k>=2且k<=總行數),使用Split函數以英文逗號為分隔符將單元格cells(k,3)中的癥狀信息進行拆分,結果放到變體變量Arr中。 第4步:遍歷數組Arr,將其和患者編號一起存儲到目標區(qū)域。 第5步:設置i=i+1,如果i<=總行數,則轉到第3步,否則結束循環(huán)。
3.2處方數據的數據預處理算法
處方數據預處理的主要算法思想是,逐行遍歷圖1所示的記錄,對于每一行數據,由左至右遍歷各藥物,并將其存儲到新表中。具體算法如下: 第1步:新建工作簿,并設置目標區(qū)域列標題。 第2步:設置整型變量i=2。從第2行開始逐行遍歷癥狀。 第3步:當i=k(k>=2且k<=總行數),從第k行4列遍歷到k行最后一列,即遍歷所有藥物和劑量。 第4步:通過遍歷藥物將其存儲到新建工作簿的目標區(qū)域。 第5步:設置i=i+1,如果i<=總行數,則轉到第3步,否則結束循環(huán)。
4算法實現及主程序
下面通過主程序來說明格式轉換過程。在以下主程序中,首先定義必需的變量,新建工作簿并設置目標區(qū)域列標題,然后循環(huán)遍歷各條記錄,對每組癥狀使用函數進行拆分處理,對每組用藥進行遍歷處理,并將處理后的信息存儲到目標區(qū)域。代碼實現如下:
在以上程序中,Array(“患者ID”,“癥狀”)函數功能返回一個指定字符序列的數組,Split(wsl.Cells(i,3),“,”)函數的功能是將字符串以逗號為標記進行切割拆分,并以數組形式返回,Work-books.Add表示新建工作簿,Range(“a65536”).End(xlUp).Row表示從指定單元格a行65536列向上查找最后一個非空單元格,及確定末尾行,Offse(1,0)表示從單元格偏移1行0列,即選擇所選單元格下方的鄰近單元格。
5討論
本文介紹了使用Excel VBA編程技術對不符合數據庫規(guī)范的電子醫(yī)案進行數據預處理的方法。此項技術可擴展至對對各類Excel文件內容格式的轉換,并可大幅降低手工處理的勞動強度,提高轉換準確率并有效縮減工作時間。這種方法為相關問題的快速解決提供了一些方法上的參考。由于Excel軟件的普遍性,使得這種方法具有廣泛的應用需求。endprint