我想弄清楚如何从文本文件中读取信息。文本文件包含信息列。我已经到了能够将它们转换为字符串数组的程度,我可以自己打印每一列。但是现在当我将String Array转换为Double数组时,我得到错误,因为文本文件包含字母" T"。我想跳过一些方法。此时我的主要目标是从文本文件中单独找到MaxT和MinT列的平均值。谢谢你我已经坚持了一段时间
This is the text file being read from
Day MaxT MinT AvgT Dept HDD CDD Prep NewSnow
1 61 38 49.5 17.8 15 0 0.00 0.0
2 60 33 46.5 14.7 18 0 0.93 0.0
3 60 36 48.0 16.0 17 0 0.80 0.0
4 36 22 29.0 -3.1 36 0 T T
5 43 18 30.5 -1.8 34 0 0.00 0.0
6 47 22 34.5 2.1 30 0 0.00 0.0
7 53 31 42.0 9.4 23 0 0.00 0.0
8 45 23 34.0 1.2 31 0 0.27 2.1
9 24 15 19.5 -13.5 45 0 0.14 2.0
10 18 11 14.5 -18.7 50 0 0.03 0.7
11 25 11 18.0 -15.4 47 0 T T
12 28 18 23.0 -10.6 42 0 0.01 0.2
13 19 10 14.5 -19.3 50 0 T T
14 21 11 16.0 -18.1 49 0 0.17 2.9
15 36 21 28.5 -5.8 36 0 T 0.0
16 38 25 31.5 -3.1 33 0 0.02 0.0
17 36 26 31.0 -3.8 34 0 T T
18 44 27 35.5 0.4 29 0 0.00 0.0
19 66 39 52.5 17.1 12 0 0.00 0.0
20 72 49 60.5 24.9 4 0 0.00 0.0
21 59 41 50.0 14.1 15 0 1.57 0.0
22 50 33 41.5 5.3 23 0 0.00 0.0
23 56 32 44.0 7.5 21 0 0.02 0.0
24 61 33 47.0 10.2 18 0 1.03 T
25 37 32 34.5 -2.6 30 0 0.04 0.5
26 38 31 34.5 -2.9 30 0 T T
27 52 27 39.5 1.7 25 0 0.00 0.0
28 66 42 54.0 15.9 11 0 T 0.0
29 60 38 49.0 10.8 16 0 0.21 0.0
This is the code I have written
String dataFileName = "inputtxt";
BufferedReader bReader = new BufferedReader(new FileReader(dataFileName));
String line;
bReader.readLine(); // this will read the first line
String line1=null; // this will skip the first line
while ((line = bReader.readLine()) != null) {
//Splitting the content of tabbed separated line
String datavalue[] = line.split("\t");
double[] numbers = new double[datavalue.length];
// Converts datavalue string array to numbers double array
for(int i = 0;i < datavalue.length;i++)
{
numbers[i] = Double.parseDouble(datavalue[i]);
}
System.out.println(numbers[0]);
}
答案 0 :(得分:2)
我认为“T”应该被忽略。这里的主要困难不是忽视“T”。设置过滤器实际上非常简单:
for(int i = 0;i < datavalue.length;i++)
{
if(!datavalue[i].equals("T"))
{
//all "T"s will be filtered out
numbers[i] = Double.parseDouble(datavalue[i]);
}else{
//???
}
}
主要问题是将“T”标记为无效值。一些解决方案是可能的:
boolean
)虽然在你的情况下整个问题会更简单:
您只需要处理“minT”和“maxT”。这些表行显然不包含任何“T”。因此,您无需过滤无效值并标记它们,而只需解析计算平均值所需的两个字段,并忽略输入的其余部分。
计算平均值:
//here we sum up the values of each column
double[] sum = new int[columnCount]; //columnCount = number of columns in the table
//count the number of valid values
int[] valueCount = new int[columnCount];
//initialize IO, etc.
...
while(...){
//read lines, etc.
for(int i = 0;i < datavalue.length;i++)
{
if(!datavalue[i].equals("T"))
{
//all "T"s will be filtered out
numbers[i] = Double.parseDouble(datavalue[i]);
sum[i] += numbers[i]; //add the value to the sum of values in that column
valueCount[i]++; //increment count of valid values
}
}
}
//calculate the average for each column
double[] average = new double[columnCount];
for(int i = 0 ; i < columnCount ; i++){
average[i] = sum[i] / valueCount[i];
}
我们的想法是通过对该列的所有值进行求和,然后将总和除以求和的值的数量,得到每列的算术平均值。我们跟踪数组sum
(按列)和valueCount
中找到的值的总和。在浏览完文件后,我们可以轻松地从收集的数据中计算出平均值。