【推荐】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
来源:oschina
链接:https://my.oschina.net/u/1425762/blog/777568