/** 解析数据行 */ 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; }