public static void selectfeatures(Pair<string, float>[] featureweights, Pair<string, string>[] labels, string inputFile, string outputFile) { orderfeatures(featureweights, inputFile); opgroup[] featureIdx = new opgroup[featureweights.Length]; for (int i = 0; i < featureweights.Length; ++i) { featureIdx[i] = new opgroup(featureweights[i].first); } globvars.labels = labels; SetMatchAttrFile(inputFile, featureIdx); FileStream fso = new FileStream(outputFile, FileMode.Create, FileAccess.Write); StreamWriter tfso = new StreamWriter(fso); FileStream fs = new FileStream(inputFile, FileMode.Open, FileAccess.Read); XmlTextReader xi = new XmlTextReader(fs); XmlTextWriter xo = new XmlTextWriter(tfso); xo.Indentation = 1; xo.IndentChar = '\t'; xo.Formatting = Formatting.Indented; while (xi.Read()) { if (xi.NodeType == XmlNodeType.Element && xi.IsStartElement()) { if (xi.Name == "dataset") { xo.WriteStartElement(xi.Name); // dataset xo.WriteAttributes(xi, true); break; } } else { xo.WriteNode(xi, true); } } xo.WriteStartElement("header"); xo.WriteStartElement("attributes"); for (int i = 0; i < featureweights.Length; ++i) { string s = featureweights[i].first; float curweight = featureweights[i].second; xo.WriteStartElement("attribute"); if (s == "class") { xo.WriteAttributeString("class", "yes"); xo.WriteAttributeString("name", "class"); xo.WriteAttributeString("type", "nominal"); xo.WriteStartElement("labels"); foreach (string x in labels.GetUnique()) { xo.WriteElementString("label", x); } xo.WriteEndElement(); // labels xo.WriteEndElement(); // attribute } else { xo.WriteAttributeString("name", s); xo.WriteAttributeString("type", "numeric"); xo.WriteStartElement("metadata"); xo.WriteStartElement("property"); xo.WriteAttributeString("name", "weight"); xo.WriteValue(curweight); xo.WriteEndElement(); // property xo.WriteEndElement(); // metadata xo.WriteEndElement(); // attribute } } while (xi.Read()) { if (xi.NodeType == XmlNodeType.EndElement) { if (xi.Name == "attributes") { xo.WriteEndElement(); } else if (xi.Name == "header") { xo.WriteEndElement(); break; } } } while (xi.Read()) { if (xi.NodeType == XmlNodeType.Element && xi.IsStartElement()) { xo.WriteStartElement(xi.Name); xo.WriteAttributes(xi, true); if (xi.Name == "instances") break; } } int vcount = 0; while (xi.Read()) { if (xi.Name == "instance") { if (xi.IsStartElement()) { vcount = 0; xo.WriteStartElement(xi.Name); xo.WriteAttributes(xi, true); } else if (xi.NodeType == XmlNodeType.EndElement) { foreach (opgroup x in featureIdx) { xo.WriteElementString("value", x.GetVal()); } xo.WriteEndElement(); } } else if (xi.Name == "value" && xi.IsStartElement()) { while (xi.Value == string.Empty) xi.Read(); featureIdx.SetValAtIdx(vcount, xi.Value); ++vcount; } } xi.Close(); fs.Close(); xo.Close(); tfso.Close(); fso.Close(); }
public static void SetMatchAttrFile(string inputFile, opgroup[] featureIdx) { int curidx = 0; FileStream fs = new FileStream(inputFile, FileMode.Open, FileAccess.Read); XmlTextReader xi = new XmlTextReader(fs); while (xi.Read()) { if (xi.IsStartElement()) { if (xi.Name == "attribute") { string attrname = xi.GetAttribute("name"); if (attrname != null) { if (featureIdx.Contains(attrname)) { featureIdx.SetMatchAttr(attrname, curidx); } } ++curidx; } } } xi.Close(); fs.Close(); }