首先接到的是一個網址,地址是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開始是從北京市開始的,而不是從中華人民共和國開始。

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