java實現讀取本地txt文件(行政區划制作層級標記表格)


首先接到的是一個網址,地址是http://www.zxinc.org/gb2260.htm。但這個網址后來就沒用了,服務器那邊應該出問題了,不過還好我保存到本地了。

再放一個雲盤

鏈接:https://pan.baidu.com/s/1Hkf2PtRGK3dLQ50tJ1mk4g
提取碼:unon 

 

 

 

 這里我是將那個頁面打開查看源碼然后復制下來的,所以前面帶了一個<BR>,這里的每行是由區划代碼、區划名稱構成。這里一共有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開始是從北京市開始的,而不是從中華人民共和國開始。

 

 

 邏輯有點亂,下次好好梳理


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM