我試圖在Python中實現一個腳本,該腳本會自動將測試序列(ERTMS子集-076-6-3)中定義的事件列表轉換爲更正式的定義;以便使用這種新形式在某些日誌文件中搜索此事件。將半結構化文本列表轉換爲正式定義
的事件在一個半結構化的形式定義如下的例子:
「含有分組255被接收到一個應答器組的消息(NID_BG = BGB)」
「DMI符號狀態(NID_MESSAGE_JRU = 21; DMI_SYMB_STATUS = < Bit66 = 0 & Bit68 = 0 & Bit70 = 0 & Bit72 = 0 & Bit74 = 0 & Bit76 = 0>)被記錄」
- 「行車制動介入被記錄。」
- 「SA-CONNECT.Confirm接收」
- 「SA-DATA請求與歐洲廣播消息 」的通信會話的發起「(NID_MESSAGE = 155)被髮送」
- 「SA-DATA指示與歐洲廣播收到「RBC/RIU系統版本」(NID_MESSAGE = 32)消息「
- 驅動程序的驗證操作記錄在JRU上。
我現在的計劃是解析每個事件列表和保存,我可以在日誌檢查值(即NID_MESSAGE_JRU = 21 Bit66 = 0 Bit68 = 0 Bit70 = 0 Bit72 = 0 Bit74 = 0 Bit76 = 0)並且將正確條件的評估函數的名稱:
def and():
return(NID_MESSAGE_JRU==21 && Bit66==0 && Bit68==0 && Bit70==0 && Bit72==0 && Bit74==0 && Bit76==0)
然後該程序,然後分析日誌,搜索將返回真到了那個功能的信息,記錄比賽看看其他條件。
現在我正在尋找一種方法來儘可能地自動化這個過程,因爲它有700多個測試序列,每個測試序列大概有80個事件。
經過一番研究後,我發現使用解析器生成器可以滿足我的需求,但是我被困在它們的絕對數量中,我無法選擇哪一個更適合我的問題。
我想出了另一種解決方案是,以評估我的事件用一些簡單的正則表達式,並使用它們產生的評估條件,然後使用eval()來評價他們,我已經從日誌加載後的值:
s = "DMI SYMBOL STATUS (NID_MESSAGE_JRU=21; DMI_SYMB_STATUS=<Bit66=0&Bit68=0&Bit70=0&Bit72=0&Bit74=0&Bit76=0>) is recorded"
s1 = s[s.find("(")+1:s.find(" ")]
s2 = s[s.find("<")+1:s.find(">")]
condition = s1 + s2
condition = re.sub('[=]','==',condition)
condition = re.sub('[;&]', '&&',condition)
condition='NID_MESSAGE_JRU==21&&Bit66==0&&Bit68==0
&&Bit70==0&&Bit72==0&&Bit74==0&&Bit76==0'
對於哪個解析生成器適合我的需求,您有什麼建議嗎?還是應該繼續使用正則表達式?或者我完全走錯了路?
基準3次測試都可以在這裏:http://www.era.europa.eu/Document-Register/Pages/Set-2-Test -Sequences.aspx – Riccardo
我無法下載測試序列文件(它們在大約35 MB下載時保持失敗);設法通過將它們交叉加載到我的DropBox然後從那裏下載來解決這個問題。 –
到目前爲止:4個.zip測試文件總共包含733個.zip測試用例(每個測試用例略大於1 MB)。每種情況都包括一個.bmp(Windows位圖)圖像,用於繪製測試場景(如列車速度與距離),一個.doc(Word 97)文檔,以及一個.mdb(Microsoft Access)數據庫,該數據庫包含事件的測試順序29張桌子,其中一些是空的。我還沒有弄清楚數據庫模式,但它看起來基本上重複了.doc(僅僅因爲一大堆額外的東西被剷除)。 –