由于项目中要用到最新版的中国行政区划数据,我总结了以下方法归集数据,仅供参考。sql
以前已经写过一篇博客《总结几个有关国家行政区划的问题》(https://my.oschina.net/Tsybius2014/blog/757009),对一些与行政区划有关的问题进行了初步的梳理,本文要实现的目标是:获取国家行政区划数据并将之导入到Oracle数据中。数据库
首先获取的数据必定要从权威渠道获取,网上找来的不少数据都是几年前的数据,而国家的行政区划每一年都有变化。通过对历年县级及以上行政区划的变化进行分析,虽然变动的实际状况多种多样,但任何种类变化均可用如下三类原子变化表示 :区域新设、区域撤销、区域改名。工具
国家行政区划数据可从国家统计局官网获取,地址为:http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/.net
本文选取发布时间最近的版本,该版本于2016年8月9日发布,区划数据为2015年9月30日的全国县级及以上行政区划数据。code
将这些数据复制到文本文件area_data.txt中,用文本编辑工具editplus打开:blog
有一点须要注意,历年数据虽然在网页上看起来格式是同样的,但从实际粘贴效果来看,不一样年的数据对空行、空格字符(全角空格、半角空格、制表符)等字符的使用可能有所不一样,所以每次操做都须要具体问题具体分析。文档
本次处理,咱们须要进行以下替换:将制表符和全角空格字符都替换为半角空格get
将这些数据粘贴到Excel文档area_data.xlsx中,我使用的Office版本为Office2010:博客
下一步是要删除数据表中的偶数行,方法是在最左侧新加一列A ,并将A列的公式设定为“=MOD(ROW(),2)”it
而后设置过滤器,点击“工具→筛选”,将A列为0的数据都过滤出来,而后一并删掉。事毕以后将用于筛选的A列删除。
再给本身定一个小目标,如今的A列显示的内容为“110000 北京市”,咱们要将它放到两列中。
选中A列,找到“数据→分列”。
向导一共分三步,第一步按默认选中分割符号。
第二步,除了Tab键外,还应勾选空格。
第三步,必定要选择“文本”,不然后续执行含VLOOKUP的公式时会出现错误,还须要从新作文本分列。
分列后的数据以下,注意A列左上角会出现绿色的小三角。
后面须要使用四个公式,将C、D、E、F四列分别计算为省、市、县、省.市.县
如下公式都供第一行使用,须要经过拉动单元格右下角扩展到后续行:
一、计算省,使用公式:=VLOOKUP(LEFT(A1,2)&"0000",$A$1:$B$3514,2,FALSE)
二、计算市,使用公式:=IF(RIGHT(A1,4)="0000","",VLOOKUP(LEFT(A1,4)&"00",$A$1:$B$3514,2,FALSE))
三、计算县,使用公式:=IF(RIGHT(A1,2)="00","",VLOOKUP(A1,$A$1:$B$3514,2,FALSE))
四、计算省.市.县,使用公式:=CONCATENATE(C1,IF(D1="","","."&D1),IF(E1="","","."&E1))
如今咱们须要将A列与F列的对应关系导入到Oracle数据库中的一张表里,假定咱们要将数据导入到表AREA_INFO_NEW中,此表结构以下:
CREATE TABLE AREA_INFO_NEW ( AREA_CODE VARCHAR(20), AREA_NAME VARCHAR(100) );
在最上方添加一行,A列地区码填写AREA_CODE,F列地区名称填写AREA_NAME,注意若是表格最后有冗余的空行,要予以删除,不然此行也会被导入到数据库中。
我使用的Oracle版本为Oracle11g,plsql客户端版本为7.0.1.1066。
用户/系统DSN选择“ExcelFiles”,用户名和密码输入Oracle用户登陆名和密码便可。
点击链接后,找到要导入的Excel表。
在“来自ODBC的数据”选项卡下,设置“导入表”并指定表为Sheet1,即咱们刚才操做Excel时使用的Sheet页。
在“到Oracle的数据”选项卡下,设置全部者、表名,并选择字段的对应关系,同名字段可创建默认的关联关系(AREA_CODE和AREA_NAME)。
点击最下方的“导入”按钮开始导入。
导入完毕后,plsql会告知导入的记录数和导入总时长。
此时可验证行政区划数据已被尽数导入到数据库中。
最后再列出三个SQL语句,当两张表有不一样的行政区划数据时,可用于作数据对比。(如行政区划新旧数据的替换,有时就须要研究清楚数据的增减变化)
设老数据保存在表AREA_INFO_OLD中,该表结构与AREA_INFO_NEW一致。
一、查询新设的行政区划
SELECT NEW.AREA_CODE, NEW.AREA_NAME FROM AREA_INFO_NEW NEW WHERE NEW.AREA_CODE NOT IN (SELECT OLD.AREA_CODE FROM AREA_INFO_OLD OLD WHERE OLD.AREA_CODE = NEW.AREA_CODE) ORDER BY NEW.AREA_CODE;
二、查询撤销的行政区划
SELECT OLD.AREA_CODE, OLD.AREA_NAME FROM AREA_INFO_OLD OLD WHERE OLD.AREA_CODE NOT IN (SELECT NEW.AREA_CODE FROM AREA_INFO_NEW NEW WHERE OLD.AREA_CODE = NEW.AREA_CODE) ORDER BY OLD.AREA_CODE;
三、查询改名的行政区划
SELECT OLD.AREA_CODE, OLD.AREA_NAME AS OLD_NAME, NEW.AREA_NAME AS NEW_NAME FROM AREA_INFO_OLD OLD, AREA_INFO_NEW NEW WHERE OLD.AREA_CODE = NEW.AREA_CODE AND OLD.AREA_NAME <> NEW.AREA_NAME ORDER BY OLD.AREA_CODE;
END