java 读取本地txt文件_java实现读取本地txt文件(行政区划制作层级标记表格)
发布日期:2021-06-24 13:23:58 浏览次数:2 分类:技术文章

本文共 3676 字,大约阅读时间需要 12 分钟。

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

再放一个云盘

d1166d195376a9bae8d3c5751cdf6b83.png

这里我是将那个页面打开查看源码然后复制下来的,所以前面带了一个

,这里的每行是由区划代码、区划名称构成。这里一共有6976行

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

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

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

public static voidmain(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= newStringBuffer();

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(newString(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.将上面的代码运行,注意文件位置是对的,正确运行的话应该是下面的样子,这是没有换行的,不过这个影响不大。

2db9823f684e249acc9ee3a5e4f1d062.png

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

b130b1d89c1492b9b311f0f0ba71e02e.png

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

40703a681127226ba783dc03c75c1411.png

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

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

3ecb3a59ab84c6c6d4d097e4ad32dd08.png

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

e01476e3e8f7678e8adb5bcaed8104c1.png

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

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

85378afce4df532aa65ec771578c5713.png

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

e4c1e1f16cd8afea03621f945ab66fb2.png

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

1be64fa1337fabbddc347e019619674a.png

cc04d220a537ae5da91db39697d52804.png

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

a7b72aea1caa9460054e30da13078134.png

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

bf39829eb51b19747beecc5efed09c3d.png

891a66bbe9451abf1b22703fcce2fa74.png

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

5a4a896229632d8dcd525867ce2cef2c.png

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

0e63e7c614d84b8dbf0431edc4e4a2a6.png

控制台输出:

53b3fe6a3e184eb2947a0448a4153e2c.png

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

9298a390c639017646056bc2294562f2.png

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

转载地址:https://blog.csdn.net/weixin_33137081/article/details/114074129 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:java getscheme_request.getScheme() 取到https正确的协议(转载)
下一篇:java eai_java与vrml在EAI接口下的配置!!成功!!!

发表评论

最新留言

很好
[***.229.124.182]2024年04月09日 09时57分21秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章