Java 从txt文件中提取数据

一测绘专业同学因为每天都有大量的数据,问我如何从文本文件中提取固定位置的数据,我先看了一下数据。
开头有几十行的无用数据

这里写图片描述
数据正文有固定的格式
这里写图片描述
整体的思路是一行一行的读取数据,将有用的行提取出来,最后从行里提取有用数据的子串保存在数组中。
其中主要运用到
* readLine()方法
readLine()方法是由BufferedReader类提供的阻塞式方法,当没有数据读取时,就一直会阻塞在那,而不是返回null;
如果不指定buffer大小,则readLine()使用的buffer有8192个字符。在达到buffer大小之前,只有遇到”/r”、”/n”、”/r/n”才会返回。

* String 中的一些基本操作 contains()和startwith()还有split(),subString()。
    contains():判断字符串中是否包含子串
    split():
    由两种重载形式 split(string regex,int limit) 和split(string regex)
    根据给定的正则匹配式的匹配拆分此字符串,limit用来限制返回数组中元素的个数。
    值得一提的是contains()中不需要转义,而split需要转义
    startWith(): 也有两种重载形式,startsWith(String str)就是来检查你所要形参参数与你字符串开头是否相同。startsWith(Sring str,int Index)其中Index指的是,你所要从原字符串下标第几个与所需要形参参数作对比。当Index为0时,与startsWith(Sring str)效果一样。 
    String subString(int start,int end):
    截取字符串
    从指定位置(start)截取到指定位置(end),
    Java API 有一个特点,通常用两个数字表示范围时,都是含头不含尾的
    代码:
package edu.whut.readTxt;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;

/**
 * 1.每次读取一行数据,循环直到文件结束
 * 2.对数据进行筛选,将有用的数据保存
 * {
 *  I 忽略前几行内容直到”End of HEADER"
 *  II  忽略“10  6 20  0  1  0.0000000  0 11G14G12G30G04G32G16G02G23G20G29G31”这种数据
 *      忽略“                                G26”这种数据
 *      忽略“        48.750”这种数据
 *      前两种用是否包含"G"来筛选,用到了字符串方法中的  contain()函数
 *      第三种用是否以”        “开头来筛选 用到了字符串方法中的  startWith()函数
 *  III " 117875970.037 8  91851391.71947  22431050.980    22431047.580          48.500"
 *      将单个数据从这一整行数据中筛选出来 
 *      用字符串中的subString(startPosition,endPosition)方法,提供所需要的子串的开始,结束位置,获取子串
 *      最后将所需要的数据统一保存在另一数组中
 * 
 *
 */
public class readData {
    public static void main(String[] args) throws IOException {
        try{
            BufferedReader in=new BufferedReader(new FileReader("D:\\dav11710.10o"));//打开文件创建数据流
            String str; //定义String变量用来保存每一次读到的每一行的数据
            String[] s=new String[0];//定义数组用来保存需要的数据
            /*忽略前几行的内容*/
            while((str=in.readLine())!=null){
                if(str.contains("END OF HEADER")){//当包含次字符串跳出循环
                    break;
                }
            }
            /*对下面的数据进行筛选*/
            while((str=in.readLine())!=null){
                if(!str.startsWith("        ")&&!str.contains("G")){//筛选条件
                    if(str.length()>0){
                        s=Arrays.copyOf(s,s.length+1);  //扩容  如果对内存没有要求可以直接声明一个大容量的数组 
                        s[s.length-1]=str.substring(50,62);//获取子串保存到数组中
                    }
                }
            }
            in.close();
            for(int i=0;i<s.length;i++){
                System.out.println(s[i]);//打印输出
                }
            } catch (IOException e) { 
        } 
    }
}
  • 10
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值