#include "GSEXmlParser.h" void Data::Dump() { LOG("Sample iid: " << iid); LOG("Source: " << source); LOG("Supplementary-Data Type: " << supp_type); LOG("Supplementary-Data: " << supp_data); LOG("\n-------- Description --------"); for(int i = 0; i < desc.GetCount(); i++) LOG(" " << desc.GetKey(i) << " ..... " << desc[i]); LOG("-------- Description --------\n"); } String Data::ToXML() { String descs; //descriptions for(int i = 0; i < desc.GetCount(); i++) descs << XmlTag("Description")("name", desc.GetKey(i)).Text(desc[i]); return XmlTag("Sample")("iid", iid)( XmlTag("Source").Text(source) + XmlTag("Supplementary-Data")("type", supp_type).Text(supp_data) + XmlTag("Descriptions") (descs) ); } String Data::ToTSV() { String tsv, tab, nl; tab = "\t"; nl = "\n"; tsv = source + tab + "Sample-iid" + tab + iid + nl + source + tab + "Supplementary-Data:" + supp_type + tab + supp_data + nl; for(int i = 0; i < desc.GetCount(); i++) tsv += source + tab + "Description:" + desc.GetKey(i) + tab + desc[i] + nl; return tsv; } void GSEParser::Dump() { LOG("\n======== GSE XML ========\n"); for (int i=0; i < data.GetCount(); i++) { data[i].Dump(); } } void GSEParser::LoadXML(String filename) { //Load XML File //LOG("\n---- GSE 2109 XML ----"); String gse; /* Cout() << filename << "\n"; String fn; fn = GetDataFile(filename); Cout() << fn << "\n"; */ gse = LoadFile(filename); //Cout() << gse << "\n"; XmlNode rnode = ParseXML(gse); //Clear Data Array data.Clear(); //Get Root Node const XmlNode &xnode = rnode["MINiML"]; //Save Data Array, one by one Vector lines, des; String str, lstr, rstr; for (int i=0; i -1) { des = Split(lines[j], ':'); } if (des.GetCount()>1) { lstr = TrimSpace(des[0]); rstr = TrimSpace(des[1]); //LOG(lstr << ":" << rstr); String& v = d.desc.GetAdd(lstr); v = rstr; } } data.Add(d); //LOG("-------- Description --------\n"); } } // } String GSEParser::ToXML() { String datas; // Datas for (int i = 0; i < data.GetCount(); i++) { datas << data[i].ToXML(); } return XmlHeader() + XmlTag("GSEFAMILY")(datas); } String GSEParser::ToTSV() { String tsv, tab; tab = "\t"; tsv = "# rowkey" + tab + "columnkey" + tab + "value\n"; for (int i = 0; i < data.GetCount(); i++) { tsv << data[i].ToTSV(); } return tsv; } String TrimSpace(String str) { while (str.StartsWith(" ") && str.GetLength()) { str = str.Mid(1); } while (str.EndsWith(" ") && str.GetLength()) { str = str.Left(str.GetLength()-1); } return str; } CONSOLE_APP_MAIN { String in, out, fmt, arg_flag; /* in = "GSE2109_family.xml"; out = "GSEFamily.tsv"; fmt = "tsv"; */ const Vector& cmdline = CommandLine(); for(int i = 0; i < cmdline.GetCount(); i++) { if (cmdline[i].StartsWith("-")){ arg_flag = cmdline[i]; } else if (arg_flag.IsEqual("-i")) { in = cmdline[i]; } else if (arg_flag.IsEqual("-o")) { out = cmdline[i]; } else if (arg_flag.IsEqual("-f")) { fmt = cmdline[i]; } else if (arg_flag.StartsWith("-")) { //Error argument Cout() << "Usage Error: invalid argument "<< arg_flag << "\n"; exit(0); } } if (cmdline.GetCount()==0 || in.IsEmpty() || out.IsEmpty() || fmt.IsEmpty()) { Cout() << "# Usage #\n"; Cout() << "For linux: GSEXmlParser -f (xml|tsv) -i (input file) -o (output file)\n"; Cout() << "For windows: GSEXmlParser.exe -f (xml|tsv) -i (input file) -o (output file)\n"; exit(0); } GSEParser parser; parser.LoadXML(in); if (fmt.IsEqual("xml")) SaveFile(out,parser.ToXML()); else if (fmt.IsEqual("tsv")) { SaveFile(out,parser.ToTSV()); } }