java自定义异常处理类
在一个团队里面,一个公司里面总是统一规则让大家遵守,自定义异常处理类也是一种统一风格的体现,使用统一的异常编码,统一的消息格式。
很多时候我们需要行政区划代码,但是并没有现成的可用,国家的民政部和统计局可以通过爬虫去获取数据。下面是我自己写的代码导入数据,分享给大家。
废话不多说,直接讲步骤,有需要可以私信我。
1、去民政部把数据下载下来,具体连接:http://files2.mca.gov.cn/cws/201407/20140716094017761.zip
2、解析数据,根据自己喜好去解析吧。
下面是我简单的解析数据的部分代码:
建表:
CREATE TABLE `gb_area` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`name_full` varchar(100) NOT NULL COMMENT '全称',
`name_short` varchar(100) DEFAULT NULL COMMENT '简称',
`name_another` varchar(100) DEFAULT NULL COMMENT '别称',
`code` varchar(100) NOT NULL COMMENT '行政编码',
`code_parent` varchar(100) DEFAULT NULL COMMENT '上级行政编码',
`level` int DEFAULT '0' COMMENT '层级',
`time_create` datetime DEFAULT NULL COMMENT '创建时间',
`time_update` datetime DEFAULT NULL COMMENT '更新时间',
`data_version` varchar(100) DEFAULT NULL COMMENT '数据版本',
`data_source` varchar(100) DEFAULT NULL COMMENT '数据来源',
`data_default` tinyint DEFAULT '1' COMMENT '默认数据',
`name_level` varchar(400) DEFAULT NULL COMMENT '带级别的全称',
`code_level` varchar(200) DEFAULT NULL COMMENT '带级别的编码',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='国家行政区划代码';
把下载下来的数据转一下编码,改为utf-8,去除每行末尾的换行符和问好。
简单粗暴的逻辑代码:
@Override
@Async
public void importCodeAsync(String path) {
try {
List<String> list = FileHelper.readFile(path);
AtomicReference<String> p0 = new AtomicReference<>("");
AtomicReference<String> p1 = new AtomicReference<>("");
AtomicReference<String> p2 = new AtomicReference<>("");
AtomicReference<String> p3 = new AtomicReference<>("");
AtomicReference<String> p4 = new AtomicReference<>("");
AtomicReference<String> p0_name = new AtomicReference<>("");
AtomicReference<String> p1_name = new AtomicReference<>("");
AtomicReference<String> p2_name = new AtomicReference<>("");
AtomicReference<String> p3_name = new AtomicReference<>("");
AtomicReference<String> p4_name = new AtomicReference<>("");
int i = 1;
log.info("开始:" + new Date());
List<GbArea> listInsert = new ArrayList<>();
Byte deft = 1;
for (String str : list) {
String flag = "\t";
String item = str.replace(flag, "");
int num = str.length() - item.length() / flag.length();
String[] prop = item.split("\\|");
GbArea area = new GbArea();
area.setDataVersion("v20131231");
area.setTimeCreate(new Date());
area.setTimeUpdate(new Date());
area.setNameFull(prop[1].trim());
area.setLevel(num);
area.setNameShort("-");
area.setNameAnother("-");
area.setDataSource("-");
area.setDataDefault(deft);
if (num == 0) {
p0.set(prop[0].trim());
p0_name.set(prop[1].trim() + ",");
area.setCode(prop[0].trim());
area.setCodeLevel(prop[0].trim());
area.setNameLevel(prop[1].trim());
p1.set("");
p2.set("");
p3.set("");
p4.set("");
p1_name.set("");
p2_name.set("");
p3_name.set("");
p4_name.set("");
} else if (num == 1) {
p1.set(prop[0].trim());
p1_name.set(prop[1].trim() + ",");
area.setCode(prop[0].trim());
area.setCodeParent(p0.get());
area.setCodeLevel(p0.get() + "," + prop[0].trim());
area.setNameLevel(p0_name.get() + prop[1].trim());
p2.set("");
p3.set("");
p4.set("");
p2_name.set("");
p3_name.set("");
p4_name.set("");
} else if (num == 2) {
p2.set(prop[0].trim());
p2_name.set(prop[1].trim() + ",");
area.setCode(p2.get());
if (StringUtil.isEmpty(p1.get())) {
area.setCodeParent(p0.get());
area.setCodeLevel(p0.get() + "," + prop[0].trim());
area.setNameLevel(p0_name.get() + prop[1].trim());
} else {
area.setCodeParent(p1.get());
area.setCodeLevel(p0.get() + "," + p1.get() + "," + prop[0].trim());
area.setNameLevel(p0_name.get() + p1_name.get() + prop[1].trim());
}
p3.set("");
p4.set("");
p3_name.set("");
p4_name.set("");
} else if (num == 3) {
p3.set(prop[0].trim());
area.setCode(p3.get());
p3_name.set(prop[1].trim() + ",");
area.setCodeParent(p2.get());
area.setCodeLevel(p0.get() + "," + p1.get() + "," + p2.get() + "," + prop[0].trim());
area.setNameLevel(p0_name.get() + p1_name.get() + p2_name.get() + prop[1].trim());
p4.set("");
p4_name.set("");
} else if (num == 4) {
p4.set(prop[0].trim());
area.setCode(p4.get());
area.setCodeParent(p3.get());
area.setCodeLevel(p0.get() + "," + p1.get() + "," + p2.get() + "," + p3.get() + "," + prop[0].trim());
area.setNameLevel(p0_name.get() + p1_name.get() + p2_name.get() + p3_name.get() + prop[1].trim());
}
if (StringUtil.isEmpty(area.getCodeLevel())) {
log.info("area-code-level:" + JSON.toJSONString(area));
continue;
} else {
area.setCodeLevel(area.getCodeLevel().replace(",,", ","));
}
i++;
listInsert.add(area);
if (i % 1000 == 0) {
gbAreaDao.insertBatch(listInsert);
Thread.sleep(20);
listInsert = new ArrayList<>();
}
if (i > list.size()) {
gbAreaDao.insertBatch(listInsert);
}
}
log.info(i + "结束:" + new Date());
} catch (Exception e) {
throw new VlihubException(e);
}
}
代码很简单,很初级,但是已经可以达到我的目的了。
主要读取文件,然后解析每行的数据,因为文本中已经缩进分级,所以很方便就可以解析出来了,并且设置对应的级别。
当然还有开源的一些爬虫代码,有兴趣自己可以去github去搜。
后面有时间我也准备写脚本从统计局和民政部抓取数据,有兴趣可以关注我哦。
vli
6 小时前