您的位置:首页 > 编程语言

使用Kettle从国家统计局下载行政区划代码数据

2017-11-21 11:03 253 查看
一、问题背景

      许多信息统计,均需基于全国最新行政区划数据。按照中华人民共和国行政区划代码标准(GB/T 2260),各行政区划至少有编码和名称两个子项。编码由6位数字组成,通过一定规则代表省、市、县三级。最新数据可以通过国家统计局官方网站(网址:http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/)下载得到。

      本文讨论的案例,就是利用Kettle(版本号:7.0)从官网上下载数据,并转为结构化数据存储。

二、输入输出

      输入数据来自互联网,数据为截止2016年7月31日的最新县及县以上行政区划代码。网址:http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/201703/t20170310_1471429.html。下面是网站截图(图1):



      输出数据为文本文件,包含一个文件头行,以及包含编码、名称两个字段的3508行数据。下图为输出文件截图(图2):



三、主要步骤

       以下将逐一解释用到的主要转换步骤。解决方案包括如下5个步骤:首先通过互联网下载网页中的原始数据,然后解析其中有用的数据块,并对数据块进行简单清洗,然后将数据块转为行集,最终逐行提取需要的字段数据。

1、下载网页数据

      通过核心对象/查询类别中的“HTTP client”步骤,可以下载到网页原始数据。注意该步骤必须有输入流方可执行,所以一般在前面增加一个步骤,用于提供URL地址的输入行集。本例只需设置字符编码和结果字段名即可,主要配置见下图(图3),选择了UTF-8编码,结果字段名webResult。



2、解析数据部分

      通过上一步骤,网页的数据将保存到名为webResult的字段中。在调试阶段可以将数据拷贝到记事本中,分析找到数据区域的规律。为了简化起见,将无关数据用省略号代替,主要数据如下图(图4)所示。



      如上图两个红色框图部分所示,本例需要的数据区域有如下规律。

开头部分为:

      <span lang="EN-US">110000<span>

结尾部分为:

      澳门特别行政区</span></b></p></div></div></div>

      可以利用核心对象/脚本类别中的“正则表达式”步骤来解析其中的数据块部分,该步骤配置的核心内容就是正则表达式,务必要确保正则表达式与内容全部匹配,并且捕获分组到指定字段。结合上述分析,我们可以将正则表达式设置为:

      [\s\S]*(<p><b><span>110000[\s\S]*澳门特别行政区</span></b></p></div></div></div>)[\s\S]*

      具体配置如下图(图5)所示:



       通过本步骤,可以将输入步骤中的webResult字段中的数据块内容,截取到body1字段中。



3、原始数据处理

       通过上述步骤,得到body1字段中的数据块具备一些特殊特征。从图1可以看出,统计局网站对省一级数据进行了加粗显示,HTML中包含许多省级数据的特殊<b></b>标记。为了避免针对省级行政区划代码的特殊处理,需要清洗掉这些特殊标记。可以选择核心对象/转换类别中的“字符串替换”步骤,讲此类特殊标记清除。主要配置如下图(图6):



      通过字符串替换步骤,可以将清洗后的数据保存到body2字段中。

4、数据块转记录

      通过上述步骤,可以得到一个相对比较纯净的数据块。如下图(图7)所示:



       为简洁起见,大部分数据用省略号代替。关键问题在于,如何将一块数据变成一行一行的信息。可以利用核心对象/转换类别中的“列拆分为多行”步骤,将块数据变成行集,而该步骤的关键又在于寻找拆分列的规律。如图7中红色部分所标识,本例中拆分的特征是</p>字符串,通过它可以将块拆分出行。具体设置如下图:



      通过拆分行步骤,所有数据将拆分到data1字段中。通过Kettle的预览视图,可以看到下图所示结果:



       可以看出,数据已经成功拆分为每个行政区一行记录。

5、有用信息萃取

       最后一个关键问题在于如何从data1字段中将地区代码和地区名称得到。同样,利用核心对象/脚本类别中的“正则表达式”步骤可以轻松将需要数据解析,关键还是在于正则表达式。通过对数据规律的分析,配置表达式如下:

       .*?<span lang="EN-US">([\S]*?)<span>[\s\S]*?<span style="font-family: 宋体">([\S]*?)</span>.*

       这样,地区代码和地区名称分别成为两个分组。详细配置如下图:



       由于文本文件导出等其他步骤都相对简单,本文不再赘述。

四、总结

本文通过互联网数据的下载、清洗、解析,完成了一个典型的文本数据块到行集的信息获取,其他类似需求均可参考。

如需原始转换文件,请联系微信号carol_sxh获取,添加好友时请注明所需文件名(KettleSample001.ktr)。

【注意】本文转自博主公众号“Kettle博士”,本公众号所发文章皆为原创,如转载请注明出处及作者。

微信扫一扫,关注该公众号
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Kettle
相关文章推荐