欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java 从txt文件中提取数据

程序员文章站 2022-07-14 21:37:40
...
一测绘专业同学因为每天都有大量的数据,问我如何从文本文件中提取固定位置的数据,我先看了一下数据。
开头有几十行的无用数据

Java 从txt文件中提取数据
数据正文有固定的格式
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) { 
        } 
    }
}