冯亦博,马腾
(中铁第一勘察设计院集团有限公司中国铁建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标准编码,在符合广大铁路工程设计人员工作习惯的基础上,可大幅减少待交付附表电子文件编制的工作量,提升设计人员工作效率,进一步推进铁路工程建设电子化、信息化进程。