制作一套适用于Oracle数据库的县及县以上行政区划数据

柔情痞子 提交于 2019-12-17 00:45:24

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

因为项目中要用到最新版的中国行政区划数据,我总结了如下方法归集数据,仅供参考。

之前已经写过一篇博客《总结几个有关国家行政区划的问题》(https://my.oschina.net/Tsybius2014/blog/757009),对一些与行政区划有关的问题进行了初步的梳理,本文要实现的目标是:获取国家行政区划数据并将之导入到Oracle数据中。

首先获取的数据一定要从权威渠道获取,网上找来的很多数据都是几年前的数据,而国家的行政区划每年都有变化。经过对历年县级及以上行政区划的变化进行分析,虽然变更的实际情况多种多样,但任何种类变化都可用以下三类原子变化表示 :区域新设、区域撤销、区域更名。

国家行政区划数据可从国家统计局官网获取,地址为:http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/

本文选取发布时间最近的版本,该版本于2016年8月9日发布,区划数据为2015年9月30日的全国县级及以上行政区划数据。

将这些数据复制到文本文件area_data.txt中,用文本编辑工具editplus打开:

有一点需要注意,历年数据虽然在网页上看起来格式是一样的,但从实际粘贴效果来看,不同年的数据对空行、空格字符(全角空格、半角空格、制表符)等字符的使用可能有所不同,因此每次操作都需要具体问题具体分析。

本次处理,我们需要进行如下替换:将制表符和全角空格字符都替换为半角空格

将这些数据粘贴到Excel文档area_data.xlsx中,我使用的Office版本为Office2010:

下一步是要删除数据表中的偶数行,方法是在最左侧新加一列A ,并将A列的公式设定为“=MOD(ROW(),2)”

然后设置过滤器,点击“工具→筛选”,将A列为0的数据都过滤出来,然后一并删掉。事毕之后将用于筛选的A列删除。

再给自己定一个小目标,现在的A列显示的内容为“110000      北京市”,我们要将它放到两列中。

选中A列,找到“数据→分列”。

向导一共分三步,第一步按默认选中分割符号。

第二步,除了Tab键外,还应勾选空格。

第三步,一定要选择“文本”,否则后续执行含VLOOKUP的公式时会出现错误,还需要重新做文本分列。

分列后的数据如下,注意A列左上角会出现绿色的小三角。

后面需要使用四个公式,将C、D、E、F四列分别计算为省、市、县、省.市.县

以下公式都供第一行使用,需要通过拉动单元格右下角扩展到后续行:

1、计算省,使用公式:=VLOOKUP(LEFT(A1,2)&"0000",$A$1:$B$3514,2,FALSE)

2、计算市,使用公式:=IF(RIGHT(A1,4)="0000","",VLOOKUP(LEFT(A1,4)&"00",$A$1:$B$3514,2,FALSE))

3、计算县,使用公式:=IF(RIGHT(A1,2)="00","",VLOOKUP(A1,$A$1:$B$3514,2,FALSE))

4、计算省.市.县,使用公式:=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一致。

1、查询新设的行政区划

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;

2、查询撤销的行政区划

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;

3、查询更名的行政区划

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!