从txt文件读取数组的平均值

时间:2016-03-29 22:58:15

标签: java arrays

我想弄清楚如何从文本文件中读取信息。文本文件包含信息列。我已经到了能够将它们转换为字符串数组的程度,我可以自己打印每一列。但是现在当我将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]);
}

1 个答案:

答案 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中找到的值的总和。在浏览完文件后,我们可以轻松地从收集的数据中计算出平均值。