正则表达式在水文年鉴资料索引编制中的应用

时间:2022-07-19 01:12:28

正则表达式在水文年鉴资料索引编制中的应用

摘要:《中华人民共和国水文年鉴》自2007年全面恢复汇编刊印以来,其资料索引表各表项的页码编制都采用人工方式从方正CEB格式的电子书逐一获取,这种方法不仅费时费力,效率低下,且容易出错。本文通过正则表达式快速、准确地获取各类成果表页码,生成水文年鉴所需的资料索引表,弥补了人工方式的不足,提高了水文年鉴质量。

中图分类号: P33 文献标识码: A 文章编号:

1 引言

《中华人民共和国水文年鉴》是按照统一的要求和规格,并按流域和水系统一编排卷册,逐年刊印的水文资料。自2007年全面恢复汇编刊印以来,其资料索引表各表项的页码编制都采用人工方式从方正CEB格式的电子书在几十个表项中逐一获取,这种方法不仅费时费力,效率低下,且容易出错。如何能快速、准确地从已有的电子文档中提取出页码,生成水文年鉴所需的资料索引表,是亟待解决的一个问题。采用基于VB开发环境和正则表达式的方法,分析各种类型成果表的组成规则,即可实现资料索引表中各种成果表页码自动的提取,在提高效率的同时,杜绝了资料索引人工编制页码过程中的错误,提高水文年鉴资料质量。

2 正则表达式

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。本文讨论的是Perl 5类型的引擎,因为这种引擎是应用最广泛的引擎。

给定一个正则表达式和另一个字符串,我们可以达到如下的目的:1、给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);2、可以通过正则表达式,从字符串中获取我们想要的特定部分。

3 表项的总体规则

正则表达式主要应用对象是文本,因此需首先用Apabi Reader将水文年鉴CEB格式的电子书另存为编码为GB2312的TXT文档。需要注意的是,高版本的Apabi Reader另存为TXT文档时默认的编码是Unicode,编码格式的不同会导致程序获取信息的失败。以《中华人民共和国水文年鉴》第5卷第4册为例,正文成果表项共计22种,分析TXT文档的格式可知,除各时段最大降水量表(1)、各时段最大降水量表(2)、堰闸流量率定成果表外,大部分表项的格式都是以数字开头,以“站”或“表”结尾;对于各时段最大降水量的表(1)、表(2),两者都以数字开头,以空白字符结尾,因而适用于同一个正则表达式;对于堰闸流量率定成果表,因在一行内会涉及到多个站的情况,因而需用特定的正则表达式单独处理;剩下都是一行只有一个表项,因而适用于同一个正则表达式处理;最后的步骤就是逐行读取TXT文本数据,然后用相应的正则语句来做匹配。

3.1 水位、流量、泥沙、水温资料索引表项的规则

对于没有堰闸流量率定成果表的卷册,字符串的匹配可以用如下正则表达式来描述:

"\d+\s[\u4e00-\u9fa5]+.*(站|表)$|^[^0-9]+.*表$"

其含义为匹配所有以数字开始、中间是中文、以“站”或“表”结尾或者不是以数字开始但以“表”结尾的字符串。

对于有堰闸流量率定成果表的卷册,除以上正则表达式外,字符串的匹配还需用如下正则表达式来描述:

"^[—]\s[0-9]+"

其含义为匹配以“—”开始,然后是空白字符,最后匹配前导数字1次或多次的字符串。该正则表达式用以判定是否存在堰闸流量率定成果表,在存在的情况下,用以下正则表达式得到满足条件的表项:

"\d+\s[\u4e00-\u9fa5]+\s[\u4e00-\u9fa5]+?.+?站(\B|$)"

其含义为匹配以数字开始,中间是任意的空白字符或者中文,最后是以“站”为边界或以“站”为结尾的字符串。由于得到的字符串为一个集合,因此还需从集合中逐一取出所需数据,然后写入文件中。

以下为匹配堰闸流量率定成果表的部分VB代码:

" objRegExp.Pattern =^[—]\s[0-9]+"

If objRegExp.Test(strContent) Then

Set colMatches = objRegExp.Execute(strContent)

iStartNo = Replace(colMatches(0).Value, "—", "")

objRegExp.Pattern = "\d+\s[\u4e00-\u9fa5]+\s[\u4e00-\u9fa5]+?.+?站(\B|$)"

If objRegExp.Test(strContent) Then

Set colMatches = objRegExp.Execute(strContent)

For Each objMatch In colMatches

strTemp = objMatch.Value & " " & strTableName & " " & iStartNo

Print FileNo, strTemp

Next

End If

End If

3.2 降水量、蒸发量资料索引表项的规则

降水量、蒸发量资料索引表项包括逐日降水量表、降水量摘录表、各时段最大降水量表、逐日水面蒸发量表等5类表项,详见表2。

表2降水量、蒸发量资料索引表项一览表

除各时段最大降水量表(1)、表(2)外,其余表项采用水位、流量、泥沙、水温资料索引中的正则语句就可以得到。

以下正则语句用以匹配各时段最大降水量表(1)、表(2):

"\d+\s?[\u4e00-\u9fa5]+.*[^0-9.\s]"

其含义为匹配以数字开始,后跟多个空字符及中文,最后以空白字符结尾的字符串。以下为匹配各时段最大降水量表(1)、表(2)的部分VB代码:

objRegExp.Pattern = "\d+\s?[\u4e00-\u9fa5]+.*[^0-9.\s]"

If objRegExp.Test(strContent) Then

strText = Left(strContent, InStr(strContent, ".") - 1)

For j = 1 To Len(strText)

If IsNumeric(Mid(strText, j, 1)) Then

If j

strNo = strNo & Val(Mid(strText, j, 1))

End If

Else

strName = strName & Mid(strText, j, 1)

End If

Next

End If

3.3 页码的规则及获取

首先给定一个初始页码,然后再根据页码行的特点,采用如下正则表达式:

"^[—][0-9]+[—]$"

其含义为匹配以“—”开头,后面紧跟数字,最后以“—”结尾的字符串。相应的匹配页码的部分VB代码为:

objRegExp.Pattern = "^[—][0-9]+[—]$"

If objRegExp.Test(strContent) Then

iStartNo = iStartNo + 1

End If

4 结束语

本文着重介绍了采用正则表达式从水文年鉴生成的TXT文档中获取水位、流量、泥沙、水温资料索引表项、降水量、蒸发量资料索引表项和页码的方法,以及实现各部分功能相对应的VB代码。该方法应用于水文年鉴资料索引编制过程中,获取页码快速、准确、高效,避免了手工提取页码的繁琐重复劳动,再将页码填写到一览表的诸多不便,消除了资料索引页码编制中的错误,提高了年鉴汇编质量,取得了满意的效果。

作者简介:

赵永俊(1977—),男,工程师,从事水文测验、资料整编等相关工作;刘礼庆(1969—),男,工程师,从事水文与水资源相关工作。

上一篇:浅谈建筑工程中地基处理的方法 下一篇:VB在构建流量监测数据库中的应用