java实现读取本地txt文件(行政区划制作层级标记表格)


首先接到的是一个网址,地址是http://www.zxinc.org/gb2260.htm。但这个网址后来就没用了,服务器那边应该出问题了,不过还好我保存到本地了。

再放一个云盘

链接:https://pan.baidu.com/s/1Hkf2PtRGK3dLQ50tJ1mk4g
提取码:unon 

 这里我是将那个页面打开查看源码然后复制下来的,所以前面带了一个
,这里的每行是由区划代码、区划名称构成。这里一共有6976行

我的需求是将这份文本做成excel,并分成三列,1列放区划代码,2列放名称,3列需要自家根据区划代码来标记区划层级,如省级则标记1,市级标记2,县级标记3.

这里我没有用一套流程走到底,excel表格也是我直接手动创建并粘贴数据上去的。我只需要在文本中过滤出我想要的数据并打印到控制台,只要行数是正确的,一列列粘贴到excel表格上是可以的。其实也可以写一个方法来写入至excel,但那样效率低,没必要。

好了直接贴代码,这里我直接是写在main方法里了,我直接将main方法复制下来。有一部分代码暂时不会用到,我将其注释掉了,等需要用时我会打开注释

public static void main(String[] args) {
        File file = new File("D:\\xzqh.txt");  //源文本
//        File file = new File("D:\\code.txt");  //代码+标记文本
        BufferedReader br = null;
        StringBuffer sb = null;
        try {
            //在字节流的基础上套用InputStreamReader转换为字符流
            br = new BufferedReader(new InputStreamReader(new FileInputStream(file.getPath()), "GBK"));
            sb = new StringBuffer();
            String line = null;
            while ((line = br.readLine()) != null) {
                sb.append(line);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                br.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        //打印文件的所有内容
        System.err.println(new String(sb));  
//      
        //设置过滤条件
//        String regex = "\\d{6}";  //匹配数字
//        String regex = "[a-zA-Z]";  //匹配英文字母
//        String regex = "[\u4e00-\u9fa5]{1,}";  //匹配中文
//        Pattern p = Pattern.compile(regex);
//        Matcher m = p.matcher(new String(sb));
//        while (m.find()) {
            //追加
//            String str1 = m.group();
//            if(str1.indexOf("省") != -1 || str1.indexOf("市") != -1 || str1.indexOf("区") != -1) {
//                System.err.println(m.group());
//            }else if(str1.indexOf("[县]") != -1) {
//                System.err.println(m.group());
//                break;
//            }else if(str1.indexOf("县") != -1 || str1.indexOf("旗") != -1 || str1.indexOf("盟") != -1) {
//                System.err.println(m.group());
//            }else if(str1.indexOf("州") != -1 || str1.indexOf("岛") != -1 || str1.indexOf("直辖行政单位") != -1) {
//                System.err.println(m.group());
//            }else if(str1.indexOf("镇") != -1 || str1.indexOf("委员会") != -1) {
//                System.err.println(m.group());
//            }else {
//                System.out.print(m.group()); 
//            }
          

        // //code处理,这段是后面加上去的
        // StringBuffer str = new StringBuffer(m.group());
        // if("A".equals(str.toString())) {
        // System.err.println(str.append("1"));
        // }else if("B".equals(str.toString())) {
        // System.err.println(str.append("2"));
        // }else if("C".equals(str.toString())) {
        // System.err.println(str.append("3"));
        // }else {
        // System.err.println(str);
        // }

//直接输出
//            System.out.println(m.group());
            //处理追加字符
//            StringBuffer str = new StringBuffer(m.group());
//            String code0 = str.substring(0, 2); //截取0-2位
//            String code1 = str.substring(2, 4); //截取中间两位
//            String code2 = str.substring(4, 6); //截取后2位
//            if(!"00".equals(code2)) { //县级
//                System.out.println(str.append("C")); 
//            }else if(!"00".equals(code1) && "00".equals(code2)) {//市级
//                System.out.println(str.append("B")); 
//            }else if(!"00".equals(code0) && "00".equals(code1) && "00".equals(code2)){ //省级
//                System.out.println(str.append("A")); 
//            }else {
//                System.out.println(str); 
//            }
//        }
    }

讲一下整体思路吧,我们得到的结果是有三列的Excel表格,所以我们一列一列的走,先拿到他的区划代码

然后接下来是步骤

1.将上面的代码运行,注意文件位置是对的,正确运行的话应该是下面的样子,这是没有换行的,不过这个影响不大。

 将 打印所有内容 那行代码注释掉,因为我们不需要打印所有,只需要将区划代码打印出来;并将下面的注释打开,如图

 再次运行程序,打印台输出区划代码,同样是6976行(总行数),将其复制粘贴至excel的第一列

 2.根据行政区划做标记省级为XX0000,市级为XXX000或XXXX00,县级为XXXXXX或XXXXX0,层级标记的是数字,所以,但是区划也是数字,在这里不好区分开,所以暂时用ABC代替123,便于过滤。

将 直接输出 那行代码注释,如图,其他则不变。这段代码是根据区划代码在后面加上标记

 输出如图:这里的000000是中华人民共和国,因为只有一个,所以我这里不做判断

 然后将打印台内容全选放入一个新的txt文本,取名code.txt。里面保存的是行政区划+区划标记的文本。(先暂时存放,后面还需要用到)

3.将 处理追加字符下面这段代码注释掉,打开 直接输出 的注释,如图

 然后将过滤条件更换成匹配中文,然后将 直接输出 这行代码注释掉,将蓝色部分代码的注释打开。这里解释一下为什么已经匹配了中文还需要这么麻烦地对比字符,这是因为有些地名实在是千奇百怪,直接匹配地名,会导致匹配出来行数对不上,也就是数据有问题,所以才这样走一遍的:

 然后直接输出,打印台是这样的,复制到Ecel,这样就拿到第二列的区划名称

 

4.读取刚才的code.txt,注意路径。并将以下代码如图注释掉。这里匹配字母然后选择过滤后直接输出!

 记得将上面的读取的文件替换成code.txt,将code处理这段注释打开,

打印出一串字母+数字组合,再将以下打印台输出的额所有内容复制到code.txt,再更换过滤条件,单独将数字取出

 过滤后直接输出即可,不需要处理什么,注意运行前记得把匹配的6为数字改成1位

 控制台输出:

 将其复制粘贴至Excel中即可。注意1开始是从北京市开始的,而不是从中华人民共和国开始。

 逻辑有点乱,下次好好梳理