搜索

java自定义异常处理类

在一个团队里面,一个公司里面总是统一规则让大家遵守,自定义异常处理类也是一种统一风格的体现,使用统一的异常编码,统一的消息格式。

版本控制管理工具

在使用计算机的过程中,我们经常会出现一个文件可能需要修改多次的情况,有效管理版本的软件应用而生。今天推荐一些开发中常用的一些相关版本的服务。

Java发送邮件

邮件在工作中必不可少,很多系统都会用到邮件,企业内部发布通知,研发人员系统告警等都需要使用邮件。下面简单来了解一下使用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 小时前

期待开发此功能

hub

2021-01-08 11:11:00

无奈之举

2021-01-08 11:12:00

好好吧

luv

2021-01-09 11:12:00

留 言