예제 #1
0
파일: RESParser.java 프로젝트: myui/smile
  /**
   * Parse a RES dataset from an input stream.
   *
   * @param name the name of dataset.
   * @param stream the input stream of data.
   * @throws java.io.FileNotFoundException
   */
  public AttributeDataset parse(String name, InputStream stream)
      throws IOException, ParseException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(stream));

    String line = reader.readLine();
    if (line == null) {
      throw new IOException("Empty data source.");
    }

    String[] tokens = line.split("\t", -1);
    int p = (tokens.length - 2) / 2;

    line = reader.readLine();
    if (line == null) {
      throw new IOException("Premature end of file.");
    }

    String[] samples = line.split("\t", -1);
    if (samples.length != tokens.length - 1) {
      throw new IOException("Invalid sample description header.");
    }

    Attribute[] attributes = new Attribute[p];
    for (int i = 0; i < p; i++) {
      attributes[i] = new NumericAttribute(tokens[2 * i + 2], samples[2 * i + 1]);
    }

    line = reader.readLine();
    if (line == null) {
      throw new IOException("Premature end of file.");
    }

    int n = Integer.valueOf(line);
    if (n <= 0) {
      throw new IOException("Invalid number of rows: " + n);
    }

    AttributeDataset data = new AttributeDataset(name, attributes);

    for (int i = 0; i < n; i++) {
      line = reader.readLine();
      if (line == null) {
        throw new IOException("Premature end of file.");
      }

      tokens = line.split("\t", -1);
      if (tokens.length != samples.length + 1) {
        throw new IOException(
            String.format("Invalid number of elements of line %d: %d", i + 4, tokens.length));
      }

      double[] x = new double[p];
      for (int j = 0; j < p; j++) {
        x[j] = Double.valueOf(tokens[2 * j + 2]);
      }

      Datum<double[]> datum = new Datum<double[]>(x);
      datum.name = tokens[1];
      datum.description = tokens[0];
      data.add(datum);
    }

    reader.close();
    return data;
  }