馮亦博,馬騰
(中鐵第一勘察設計院集團有限公司中國鐵建BIM工程實驗室,陜西 西安 710000)
鐵路工程設計是一項龐大復雜的系統性工程,其項目類型多、涉及專業多、參與人員多[1],需要設計單位內部及外部團隊之間密切協同,協同工作難度大。另外,為了充分發揮設計成果的數據價值,鐵路工程設計數據需要在項目各參與方以及項目各階段之間準確、高效、無損傳遞,這對鐵路工程設計信息化水平提出了更高要求。目前,在鐵路各專業設計過程及最終設計成果中,數據內容傳遞多采用Excel表格來完成,但Excel數據缺乏統一、固定的模式,不能進行分類描述處理[2],本身不屬于結構化數據,不是數據存儲的理想格式;面對龐大復雜的鐵路系統工程,若利用Excel數據進行數據交換,容易出現設計意圖表達與理解不明確、數據傳遞不順暢等問題,影響鐵路工程項目的順利推進。
目前,常用的數據交換格式主要包括XML、JSON(JavaScript Object Notation)、YAML等[3],其中JSON是一種輕量級的數據交換格式[4],基于純文本,數據格式非常簡單,層次清晰,易于閱讀和編寫,同時也易于機器解析和生成,具備良好的靈活性[5]。如果將鐵路工程設計數據存儲為JSON格式結構化數據,利用JSON解析器可以將繁雜的數據表現為結構明晰的樹狀結構,能夠讓使用者更加快速獲取所需的信息,數據的傳遞也會變得更加準確而高效。JSON格式文件樹狀結構見圖1。

圖1 JSON格式文件樹狀結構
國際字典框架(International Framework for Dictionaries,IFD)是目前工程行業常用的一種標準,其目的是保證所交換的數據信息與用戶需要的數據信息完全一致。IFD標準為每條數據賦予唯一標識碼GUID,使得無論在哪種環境下,只要數據的IFD編碼一致,就可以保證其代表的信息是一致的[6]。2014年12月,鐵路BIM聯盟發布了《鐵路工程信息模型分類和編碼標準(1.0版)》(簡稱鐵路IFD標準),是為規范鐵路工程信息的分類、編碼與組織,實現鐵路工程全生命周期信息的交換、共享,推動鐵路工程信息模型的應用發展而制定的標準。鐵路IFD標準分類表可分為3類:一類是引用國家標準;一類是在國家標準基礎上擴充鐵路工程內容;最后一類是鐵路工程獨立編制的分類表[7]。部分鐵路IFD標準編碼見圖2。

圖2 部分鐵路工程IFD標準編碼
目前,鐵路IFD標準主要應用于鐵路BIM模型的屬性擴展,為BIM模型在工程項目管理平臺內層級結構的建立與管理提供便利[8]。由于鐵路工程設計數據需要在項目各參與方以及項目各階段之間傳遞,若將IFD標準編碼引入鐵路工程設計數據表,對數據表所包含的條目進行一一對應的IFD編碼,數據表內容將會得到更精確的描述,數據流轉的準確性也會得到保障。根據以“歐賽(OpenDesign)”數據管理軟件為代表的鐵路行業施工圖電子交付工具對鐵路工程設計數據表的要求,為精確識別設計數據表格內容,需要提供能夠反映設計數據條目層級關系的IFD編碼,以便對設計數據表進行導入操作,所以將鐵路IFD標準編碼引入鐵路工程設計數據表勢在必行。
根據中國國家鐵路集團有限公司發布的《鐵路建設項目施工圖電子文件交付管理辦法》(鐵建設〔2020〕123號)文件要求,施工圖相關附表電子文件須通過基于文本的結構化數據交換格式提供。對于設計人員,由于工作習慣及代碼編寫水平的限制,無法直接將設計成果相關數據以純文本代碼形式編寫為結構化數據交換格式??紤]到Microsoft Office系列辦公軟件在廣大設計人員中的使用普遍性和便利性,只有將設計成果數據先錄入Excel表格,再通過工具將Excel表格轉換為結構化數據交換格式,才是現階段相關附表電子文件以結構化格式交付的可行途徑。
目前,已有很多第三方工具可以實現Excel表格數據向JSON結構化數據的轉換,例如Microsoft Excel程序內的轉換插件以及部分在線轉換工具,但這些轉換工具僅可對數據與表頭內容一一對應且無合并單元格的簡單Excel表格進行轉換,不能對表頭存在合并單元格的多層復雜Excel表格進行轉換。鐵路工程各專業設計數據復雜、種類繁多,為了保證設計數據的完備性及準確性,有時對于同一個表頭元素需要定義若干個屬性描述類目,所以大部分鐵路工程設計數據Excel表格將以合并單元格的復雜表頭形式呈現。通過對存在合并單元格表頭的設計數據Excel表格進行研究,提出一種基于VBA的鐵路工程設計結構化數據交換格式轉換方法。帶有合并單元格表頭的鐵路工程設計數據表示例見圖3。

圖3 帶有合并單元格表頭的鐵路工程設計數據表示例
VBA是Visual Basic的一種宏語言,是在桌面應用程序中執行通用自動化任務的編程語言,主要能用來擴展Windows應用程序功能,特別是Microsoft Office軟件[9]。在鐵路工程設計數據已經采用Excel表格形式進行存儲的基礎上,直接利用VBA實現結構化數據格式轉換將更加便捷和直觀。
JSON格式數據文件以純文本形式進行存儲,因此可利用VBA的Adodb.Stream組件UTF-8文本流實現JSON格式數據文件的編寫。JSON的語法也較為簡單,數據以名稱/值對體現,值可以是字符串、數字、對象、數組、邏輯值、null中的一種[10]。以大括號“{}”代表對象,中括號“[]”代表數組;對象可以包含多個名稱/值對,數組可以包含多個對象;對象中的同級值對或數組中的同級對象之間用逗號“,”隔開,最后一個值對或對象之后不再出現逗號[11]。JSON文件的編寫只有建立在上述語法基礎上才是正確可被解析的。
針對不同專業不同內容的數據表格,表頭級數、合并形式也完全不同,為了將表頭內容按層級分解為JSON對象,同時將基層表頭與相應數據處理為JSON值對,首先需要將表頭區域與數據區域進行分離。根據數據表格特點,與數據直接對應的基層表頭單元格無論是否為合并單元格,其列數均為1,于是可以利用單元格列數語句MergeArea.Columns.Count,對數據表單元格按從左到右、從上到下順序逐一進行判斷;若單元格列數非1則跳至下一行首端繼續進行判斷,直到某行各單元格列數均為1時即可停止判斷,該行至表格首行即為表頭所在區域,其下一行至表格末行即為數據所在區域。表頭區域的分離流程見圖4。

圖4 表頭區域的分離流程
表頭區域與數據區域分離后,即進入數據處理、JSON文件編寫階段。根據JSON文件編寫特點,對于同一行數據,Excel表頭單元格的處理順序只能是由左至右依次對每列表頭單元格由上至下進行處理,橫向合并表頭單元格作為子對象名稱,基層表頭單元格與數據構成值對;同時,多行數據子對象以數組形式進行集合。因此,具有合并單元格表頭的Excel表格向JSON格式文件轉換的要點在于,如何準確識別表頭子對象的起始、表頭子對象的結尾以及同級表頭子對象或值對之間的間隔,并分別進行處理,才能滿足JSON格式文件語法要求。
針對具有合并單元格的Excel表頭識別,提出一種遍歷Excel表格表頭區域,逐個對單元格進行分析的方法。根據Excel表格特點,合并單元格只在合并范圍內的左上角單元格存儲合并單元格的有效值,其余單元格均為空格。利用該特點可篩選出非空表頭單元格,同時利用MergeArea.Columns.Count語句判斷表頭單元格是否為單列。對于單列表頭,直接與相應數據單元格合并組成值對;對于多列表頭,將其作為子對象進行處理,并寫入符號“:{”作為子對象起始符。
當遍歷至表頭區域末行的基層表頭單元格后,即可向上逐行對同列表頭單元格進行分析,直到表頭區域首行為止,以準確識別子對象的結尾。首先利用MergeArea.Row語句判斷上方單元格與上級表頭合并單元格的有效單元格是否位于同一行,再利用MergeArea.Column計算出上方單元格與有效單元格所在列號的差值,并與合并單元格列數MergeArea.Columns.Count進行對比,若兩者相等即可認定上方單元格已位于上級表頭合并單元格的末尾,寫入符號“}”作為該子對象的結尾符。
對于數據區域同一行數據單元格,通過判斷,若未處于末列,值對之間以及同級子對象之間需寫入符號“,”進行分隔;同時,對于數據區域各行,通過判斷,若未處于末行,各行子對象之間也需寫入符號“,”進行分隔。
通過遍歷Excel表格單元格實現結構化數據交換格式轉換的流程見圖5。

圖5 Excel表格向結構化數據交換格式轉換流程
利用上述方法,將上文示例表格(見圖3)轉換為JSON格式文件的代碼見圖6。

圖6 示例表格轉換為JSON格式文件代碼
綜上,通過運用VBA工具,實現對鐵路工程設計數據Excel表格各單元格的遍歷,結合合并單元格的多種屬性進行判別,將Excel表格的表頭及數據與JSON格式文件的子對象及值對一一對應,并根據JSON格式文件語法要求分別進行處理,從而完成鐵路工程設計結構化數據交換格式轉換。
以“歐賽(OpenDesign)”數據管理軟件為例,鐵路工程設計數據的錄入一般有2種途徑:一種是通過數據管理軟件的表格模板進行手動輸入;另一種是通過附帶IFD標準編碼的設計數據Excel表格進行導入。由于數據管理軟件運行環境目前僅限于Linux平臺,直接在數據管理軟件內進行手動輸入存在諸多不便。但如果在設計數據Excel表格內手動添加反映層級關系的IFD標準編碼,也存在工作量大、查找困難、容易出錯等問題。
結合上文遍歷單元格的方法,鐵路工程設計數據表IFD標準編碼可采用對表頭區域進行從上至下、從左至右逐格分析處理的自動化操作方法。一方面該方法可去除表頭單元格內包含的計量單位標注,另一方面可在鐵路IFD標準編碼庫內查找表頭內容,通過定位獲取對應的IFD標準編碼,并寫入創建的IFD標準編碼一維數組中。為了在IFD標準編碼中體現表頭內容的層級關系,若正在處理的表頭單元格被判斷為非基層表頭,則對相應的IFD標準編碼另行添加后綴“_”;若正在處理的表頭單元格被判斷為基層表頭,則不添加后綴。最后利用join函數連接IFD標準編碼一維數組各元素,并將其作為文本寫入設計數據表新增首行對應的單元格內,完成鐵路工程設計數據表IFD標準自動編碼,該成果為鐵路工程設計數據表導入“歐賽(OpenDesign)”數據管理軟件提供了可行途徑。實現鐵路工程設計數據表IFD標準自動編碼的流程見圖7。

圖7 鐵路工程設計數據表IFD標準自動編碼流程
利用上述方法,將上文示例表格(見圖3)進行IFD標準編碼的結果見圖8。

圖8 引入IFD標準編碼的鐵路工程設計數據表示例
將附帶IFD標準編碼的鐵路工程設計數據表導入“歐賽(OpenDesign)”數據管理軟件的結果見圖9。

圖9 附帶IFD標準編碼的鐵路工程設計數據表導入結果
提出的鐵路工程設計結構化數據交換格式轉換方法及鐵路IFD標準編碼方法,適用于多種形式的鐵路工程設計數據Excel表格,并具有結構簡單、邏輯清晰、簡單實用等特點。同時,該方法可利用Visual Basic平臺進行移植,并封裝成可獨立運行的轉換工具及編碼工具,能夠將鐵路工程設計數據Excel表格批量轉換為JSON格式文件及批量進行IFD標準編碼,在符合廣大鐵路工程設計人員工作習慣的基礎上,可大幅減少待交付附表電子文件編制的工作量,提升設計人員工作效率,進一步推進鐵路工程建設電子化、信息化進程。