导读:针对卫统4表对应的DBF文件列数过多无法编辑的问题,利用java语言设计了数据文件生成程序。通过编写数据接口,连接数据库,写入数据等方式生成了符合卫生管理部门要求的DBF文件,并能够成功通过数据上传页面的验证。
前言
卫统4表简介卫统4表是指《全国卫生资源与医疗服务调查制度》中规定的第四个调查表,即:医院出院病人调查表(后简称卫统4表)。该表的数据主要来自病案首页,包含了患者的个人身份,入院诊断和出院转归等详细诊疗信息。该系列调查表于2007年由国家卫生部制订,并依照分级负责,属地管理的原则由各个省市独立收集完成后统一上报,起到提升数据准确性,及时获取各地区医疗资源与卫生服务信息的作用,是国家和地方政府卫生管理部门制订卫生政策,了解管辖区内医疗机构运营状况的重要信息来源。该表曾长期以纸质表格形式由各大医院向上级管理部门上报,如今随着医院信息化如火如荼的进行,卫统4表也转变成了DBF格式,通过网络直报的形式进行上传。
DBF数据格式简介DBF是一种较古老的文件格式,其历史可以一直追溯到DOS操作系统时期,当时广泛使用的dBase和FoxPro数据库正是使用的该数据格式。DBF文件以二进制的形式存储数据,文件内部格式要求非常严格,具体来说以文件头和记录项组成,文件头包含了版本信息、更新时间、文件长度等数据,还有字段名称、类型、字段长度、精度等字段信息,记录项则用于保存表格数据。随着功能更强的小型数据库格式大量产生,比如mysql、sqlite、access等,DBF格式渐渐被取代,开发者对其支持也随之减少,但由于其功能的完整性,许多政府机构和职能部门仍然在使用该格式进行数据传递。
现阶段存在问题根据中国卫生部发布的接口规范,最新版的卫统4表包含有325个字段,且必须使用DBF数据格式进行上报。目前市面上的主流DBF编辑软件都是基于微软公司的相关API打造,而由于年代久远的原因,这些开发工具长期缺少维护和支持,所以现在主流的软件(例如Visual Fox Pro,后文简称VFP)都只支持生成最多含有255个字段的DBF文件,该文件因为列数过少而无法通过上传页面的数据校验,因此,设计一款能支持超过255列的DBF编辑软件对卫生信息统计直报工作具有重要意义。
Java编程语言介绍使用java语言进行编程。该编程语言由美国Sun公司(现已被Oracle公司收购)在上世纪九十年代研发,该语言既保留了以往多种编程语言的精华,并使其语法结构向最为经典的C语言系列靠拢,同时舍弃了C语言中复杂晦涩的指针和宏定义等部分,因此Java具有简洁、面向对象、稳健、开源等特点而广受开发者欢迎至今。之所以选择Java语言,一方面是因为其众多的优点,另一方面是因为其拥有来自世界各地开发者创造的大量工具包,使得Java语言的功能更加强大。
方法
创建规范接口要写入数据必须先定义数据接口,也就是定义字段名和字段类型等信息,国家卫生部为基层医疗机构提供了一份标准文档,数据文件的各个字段必须符合其要求才能顺利上传。首先调用javadbf包,引入DBFField名称空间,然后创建一个DBFField的数组实例fields,根据标准文档的要求将数组长度设为325,此时数组fields中的每个成员fields[i]就能代表接口文档中的第i个字段。根据不同字段的要求,使用fields[i] = new DBFField()语句来进行默认初始化,获得单个字段实例并对其属性进行设置。根据标准文档的要求,使用setName()函数来设定字段名,使用setDataType()函数来定义字段类型,使用setFieldLength()函数设置字段长度,如果是数值型变量还要使用setDecimalCount()方法来设置浮点位数,逐列设置后,就能使用DBFWriter类的setFields(fields)语句将其存入书写器,然后使用DBFWriter类的write()方法将设置好的数据接口写入到硬盘的具体路径中去,此时就已经生成了空的接口文件。
连接oracle数据库准备好数据接口后就需要获取数据,Java语言能够直接从各种类型的关系型数据库中获取数据,比如sql server,mysql和Oracle,由于Oracle数据库使用比较广泛,将以oracle数据库为例。首先实例化Connection类创建一个新的数据库连接,在初始化该实例时使用OracleDriver关键字配置Oracle驱动,用三个字符串变量存储连接地址、用户名和密码,并将其值传入连接实例的getConnection函数获取连接,使用PreparedStatement类的实例执行sql脚本,并传入需要获取的字段名称等相应参数就能得到存储在服务器中的数据。
生成DBF文件得到了数据后就可以将其写入到编写好的数据接口中。首先为BufferedReader类创建一个实例,该实例能够读取各种类型的数据流,如果数据中有中文字符串,则实例化时要对charset选项使用“gbk”关键字,以免产生乱码。使用数据流实例的readLine()和split()方法的组合对每一行的数据流按字段进行分解,每一行就能得到325个待写入DBF的数据,并保存在一个相同长度的Object类数组中以待写入;随后使用循环体逐列判断字段类型,并对相应的Object实例使用Parse方法转换数据类型,然后逐行使用DBFWriter类的addRecord()方法将数据写入,将循环次数设置为和数据行数一致时,就能够将全部数据写入到DBF文件中。
结果
该程序运行的过程中可能会出现一些异常状况,因为数据库里保存的数据并不完全按照规范存储,在格式化读取的过程中就会报错,因此读取和写入的过程都需要使用try…catch结构,一旦数据库内保存的数据有误就会在catch块中执行相应的备用语句,把相应数据填入到有误的数据位置。
该程序能顺利生成含有325列的DBF文件,且每个字段都严格满足卫生部数据接口的要求,经过测试能顺利上传到省卫计委的数据上传平台。该程序生成的DBF文件不能用VFP等专用的编辑软件打开,因为其列数超过了255列,传统软件已经无法识别,只能通过编写专门的读取程序进行测试。
卫生信息网络直报工作对于国家和基层卫生管理部门都具有重要的意义,通过收集全国各地的卫生资源配置信息,以及医疗质量信息,卫生管理部门才能有的放矢地制订具有针对性的卫生政策。随着医院信息化的加深,数据上报方式也从纸质上报变成了电子数据上报,而政府部门普遍使用的古老数据库格式支持的列数过少,给基层单位的数据上报工作造成了困扰。
论文介绍了如何使用Java语言编程并生成卫统4表对应的DBF文件,介绍了如何设计满足要求的数据接口、如何连接数据库读取数据并写入到数据接口的方法,所生成的DBF文件拥有超过DBF文件标准限制的字段数量,能够完美满足卫计委数据上报要求。
文章来源:《中国数字医学》杂志2018年第10期,作者及单位:彭乔立 孔萍 肖辉,武汉大学中南医院信息中心。
领取专属 10元无门槛券
私享最新 技术干货