Java 从txt文件中提取数据
程序员文章站
2022-07-14 21:37:40
...
一测绘专业同学因为每天都有大量的数据,问我如何从文本文件中提取固定位置的数据,我先看了一下数据。
开头有几十行的无用数据
数据正文有固定的格式
整体的思路是一行一行的读取数据,将有用的行提取出来,最后从行里提取有用数据的子串保存在数组中。
其中主要运用到
* 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) {
}
}
}