source: GSEXmlParser/GSEXmlParser.cpp @ 29

Last change on this file since 29 was 29, checked in by sunny, 16 years ago
  1. add -f flag for xml and tsv file type
  2. output tsv file format
File size: 4.7 KB
Line 
1#include "GSEXmlParser.h"
2
3void   Data::Dump()
4{
5    LOG("Sample iid: " << iid);
6    LOG("Source: " << source);
7    LOG("Supplementary-Data Type: " << supp_type);
8    LOG("Supplementary-Data: " << supp_data);
9    LOG("\n-------- Description --------");
10    for(int i = 0; i < desc.GetCount(); i++)
11        LOG("   " << desc.GetKey(i) << " ..... " << desc[i]);
12    LOG("-------- Description --------\n");
13}
14
15String   Data::ToXML()
16{
17    String descs; //descriptions
18    for(int i = 0; i < desc.GetCount(); i++)
19        descs << XmlTag("Description")("name", desc.GetKey(i)).Text(desc[i]);
20
21    return XmlTag("Sample")("iid", iid)(
22                     XmlTag("Source").Text(source) + 
23                     XmlTag("Supplementary-Data")("type", supp_type).Text(supp_data) +
24                     XmlTag("Descriptions") (descs) 
25                 );
26}
27
28String Data::ToTSV()
29{
30  String tsv, tab, nl;
31  tab = "\t";
32  nl = "\n";
33  tsv = source + tab + "Sample-iid" + tab + iid + nl +
34        source + tab + "Supplementary-Data:" + supp_type + tab + supp_data + nl;
35  for(int i = 0; i < desc.GetCount(); i++)     
36      tsv += source + tab + "Description:" + desc.GetKey(i) + tab + desc[i] + nl; 
37       
38  return tsv;
39}
40
41void   GSEParser::Dump()
42{
43  LOG("\n======== GSE XML ========\n");
44  for (int i=0; i < data.GetCount(); i++) {
45    data[i].Dump();
46  }
47}
48
49void GSEParser::LoadXML(String filename) {
50  //Load XML File
51    //LOG("\n---- GSE 2109 XML ----");
52    String gse;
53    gse = LoadFile(GetDataFile(filename));
54    XmlNode rnode = ParseXML(gse);
55   
56    //Clear Data Array
57    data.Clear();
58   
59    //Get Root Node   
60    const XmlNode &xnode = rnode["MINiML"];
61   
62    //Save Data Array, one by one
63    Vector<String> lines, des;
64    String str, lstr, rstr;
65    for (int i=0; i<xnode.GetCount(); i++) {
66       if (xnode[i].GetTag()=="Sample") { 
67          //LOG("Sample(iid):" << xnode[i].Attr("iid"));
68          //LOG("Source:" << xnode[i]["Channel"]["Source"].GatherText());
69          //LOG("\n-------- Description --------");
70          Data d;
71          d.iid = xnode[i].Attr("iid");
72          d.source = xnode[i]["Channel"]["Source"].GatherText();
73          d.supp_type = xnode[i]["Supplementary-Data"].Attr("type");
74          d.supp_data = xnode[i]["Supplementary-Data"].GatherText();
75          lines = Split(xnode[i]["Description"].GatherText(),'\n');
76          for (int j=0; j<lines.GetCount(); j++) {
77              if (lines[j].Find("=") > -1) {
78                  des = Split(lines[j], '=');
79              } else if (lines[j].Find(":") > -1) {
80                  des = Split(lines[j], ':');
81              }
82              if (des.GetCount()>1) {
83                  lstr = TrimSpace(des[0]);
84                  rstr = TrimSpace(des[1]);                 
85                  //LOG(lstr << ":" << rstr);
86                  String& v = d.desc.GetAdd(lstr);
87                  v = rstr;
88              }
89          }
90          data.Add(d);
91          //LOG("-------- Description --------\n");
92       }
93    }
94    //   
95}
96
97String   GSEParser::ToXML()
98{
99  String datas; // Datas
100    for (int i = 0; i < data.GetCount(); i++) {
101        datas << data[i].ToXML();
102    }
103    return XmlHeader() + XmlTag("GSEFAMILY")(datas);
104}
105
106String   GSEParser::ToTSV()
107{
108  String tsv, tab; 
109  tab = "\t";
110  tsv = "# rowkey" + tab + "columnkey" + tab + "value\n";
111  for (int i = 0; i < data.GetCount(); i++) {
112    tsv << data[i].ToTSV();
113  }
114  return tsv;
115}
116
117String TrimSpace(String str) {
118  while (str.StartsWith(" ") && str.GetLength()) {
119    str = str.Mid(1);
120  }
121  while (str.EndsWith(" ") && str.GetLength()) {
122    str = str.Left(str.GetLength()-1);
123  }
124  return str;
125}
126
127CONSOLE_APP_MAIN
128{
129  String in, out, fmt, arg_flag;
130  /*
131  in = "GSE2109_family.xml";
132  out = "GSEFamily.tsv";
133  fmt = "tsv";
134  */
135  const Vector<String>& cmdline = CommandLine();
136   
137  for(int i = 0; i < cmdline.GetCount(); i++) {
138    if (cmdline[i].StartsWith("-")){
139      arg_flag = cmdline[i];     
140    } else if (arg_flag.IsEqual("-i")) {
141      in = cmdline[i];   
142    } else if (arg_flag.IsEqual("-o")) {
143      out = cmdline[i];     
144    } else if (arg_flag.IsEqual("-f")) {
145      fmt = cmdline[i];
146    } else if (arg_flag.StartsWith("-")) {
147      //Error argument
148      Cout() << "Usage Error: invalid argument "<< arg_flag << "\n";
149      exit(0);
150    }
151  }
152 
153  if (cmdline.GetCount()==0 || in.IsEmpty() || out.IsEmpty() || fmt.IsEmpty()) {
154    Cout() << "Usage: GSEXmlParser.exe -f (xml|tsv) -i (input file) -o (output file)\n";
155    exit(0); 
156  }
157 
158  GSEParser parser;
159  parser.LoadXML(in);
160  if (fmt.IsEqual("xml"))
161    SaveFile(out,parser.ToXML());
162  else if (fmt.IsEqual("tsv"))  {
163    SaveFile(out,parser.ToTSV());
164  }
165 
166 
167 
168}
169
Note: See TracBrowser for help on using the repository browser.