/** 解析数据行 */
  private static boolean parserDate(String line) {
    if (line == null) {
      return true;
    }
    Item item = new Item();
    Attribute attr = null;
    int index = 0;
    int si;
    String data;
    int nData;
    /*
     * 根据解析出来的属性的个数和类别,解析数据。
     */
    for (AttributeClass ac : arff.aclasses) {
      si = index;
      while (index < line.length() && line.charAt(index) != ',') ++index;

      data = line.substring(si, index);

      if (ac.type == AttributeType.NUME) {
        nData = Integer.valueOf(data);
        attr = new Attribute(ac, nData);
      } else {
        attr = new Attribute(ac, ac.getCateIndex(data));
      }

      item.addAttr(attr);
      ++index;
    }

    arff.addItem(item);
    return true;
  }
  /** 解析属性行 */
  private static boolean parserAttribute(String line) {
    // @attribute sex {Female,Male}
    // @attribute capital-gain numeric
    if (line == null) {
      return true;
    }

    int index = 0; // 字符串的当前位置。
    // 跳过"@attribute"
    index += "@attribute".length();

    // 跳过空白。
    while (Character.isWhitespace(line.charAt(index))) ++index;

    // 遇到了属性的名字
    String name;
    int nameStart = index; // 名字开始的位置。
    while (!Character.isWhitespace(line.charAt(index))) ++index;
    // 此时index直向属性名字后面的空格。
    name = line.substring(nameStart, index);

    // 下面解析属性值。
    // 跳过空白。
    while (Character.isWhitespace(line.charAt(index))) ++index;
    if (line.charAt(index) == '{') { // 是categorical类型属性
      // @attribute sex {Female,Male}
      AttributeClass ac = new AttributeClass(AttributeType.CATE, name);

      String cateName;
      int cateStart;
      while (line.charAt(index) != '}') {
        ++index;
        cateStart = index;
        while (line.charAt(index) != ',' && line.charAt(index) != '}') {
          ++index;
        }
        cateName = line.substring(cateStart, index);
        ac.addCate(cateName);
      }
      arff.addAttrClass(ac);
    } else { // 是numeric类型属性
      arff.addAttrClass(new AttributeClass(AttributeType.NUME, name));
    }

    return true;
  }