搜索

搭建个人存储服务器NAS

用过了各种网盘,各种限制,各种害怕数据泄露,于是就踏上了搭建自己存储服务器这条路,如果有条件赶紧试试吧。

掌上菜谱-微菜谱等你来解锁

像我这种不会做饭的人,偶尔兴趣来潮,想动手做做饭,泡泡茶,那么就需要一本菜谱来指引了,为此,我专门开发了一款菜谱小程序,欢迎体验。

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去搜。

后面有时间我也准备写脚本从统计局和民政部抓取数据,有兴趣可以关注我哦。

 

 

 

留 言