1
2
3
4
5
6
7
37
38 package main
39
40 import (
41 "bytes"
42 "flag"
43 "fmt"
44 "github.com/clbanning/mxj"
45 "log"
46 "os"
47 "sort"
48 "time"
49 )
50
51 func main() {
52 var file string
53 flag.StringVar(&file, "file", "", "file to process")
54 flag.Parse()
55
56 fh, fherr := os.Open(file)
57 if fherr != nil {
58 fmt.Println("fherr:", fherr.Error())
59 return
60 }
61 defer fh.Close()
62 fmt.Println(time.Now().String(), "... File Opened:", file)
63
64
65 fs, _ := fh.Stat()
66 xmldata := make([]byte, fs.Size())
67 n, frerr := fh.Read(xmldata)
68 if frerr != nil {
69 fmt.Println("frerr:", frerr.Error())
70 return
71 }
72 if int64(n) != fs.Size() {
73 fmt.Println("n:", n, "fs.Size():", fs.Size())
74 return
75 }
76 fmt.Println(time.Now().String(), "... File Read - size:", fs.Size())
77
78
79 xmlReader := bytes.NewBuffer(xmldata)
80
81
82
83 m, raw, merr := mxj.NewMapXmlReaderRaw(xmlReader)
84 if merr != nil {
85 log.Fatal("merr:", merr.Error())
86 }
87 fmt.Println(time.Now().String(), "... XML Unmarshaled - len:", len(m))
88 fmt.Println("raw XML buffer size (should be same as File size):", len(raw))
89
90
91
92
93 metricVals, err := m.ValuesForPath("Metrics.Metric")
94 if err != nil {
95 log.Fatal("err:", err.Error())
96 }
97 fmt.Println(time.Now().String(), "... ValuesFromKeyPath - len:", len(metricVals))
98
99
100 for _, v := range metricVals {
101 aMetricVal := v.(map[string]interface{})
102
103
104 id := aMetricVal["-id"].(string)
105 desc := aMetricVal["-description"].(string)
106 mf, mferr := os.OpenFile(id+".csv", os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0666)
107 if mferr != nil {
108 fmt.Println("mferr:", mferr.Error())
109 return
110 }
111
112 fmt.Print(time.Now().String(), " id: ", id, " desc: ", desc)
113 mf.WriteString(id + "," + desc + "\n")
114
115
116 for key, val := range aMetricVal {
117 switch key {
118 case "Values":
119
120 values := val.(map[string]interface{})["Value"].([]interface{})
121 fmt.Println(" len(Values):", len(values))
122
123
124 var gotKeys bool
125 for _, vval := range values {
126 valueEntry := vval.(map[string]interface{})
127
128
129 lv := len(valueEntry)
130 list := make([][2]string, lv)
131 var i int
132 for k, v := range valueEntry {
133 list[i][0] = k
134 list[i][1] = v.(string)
135 i++
136 }
137 sort.Sort(mylist(list))
138
139
140 if !gotKeys {
141
142 var gotFirstKey bool
143
144 for i := 0; i < lv; i++ {
145 if gotFirstKey {
146 mf.WriteString(",")
147 } else {
148 gotFirstKey = true
149 }
150
151 mf.WriteString((list[i][0])[1:])
152 }
153 mf.WriteString("\n")
154 gotKeys = true
155 }
156
157
158 var gotFirstVal bool
159
160 for i := 0; i < lv; i++ {
161 if gotFirstVal {
162 mf.WriteString(",")
163 } else {
164 gotFirstVal = true
165 }
166 mf.WriteString(list[i][1])
167 }
168
169
170 mf.WriteString("\n")
171 }
172 case "Value":
173 vv := val.(map[string]interface{})
174 fmt.Println(" len(Value):", len(vv))
175 mf.WriteString("value\n" + vv["-value"].(string) + "\n")
176 }
177 }
178 mf.Close()
179 }
180 }
181
182 type mylist [][2]string
183
184 func (m mylist) Len() int {
185 return len(m)
186 }
187
188 func (m mylist) Less(i, j int) bool {
189 if m[i][0] > m[j][0] {
190 return false
191 }
192 return true
193 }
194
195 func (m mylist) Swap(i, j int) {
196 m[i], m[j] = m[j], m[i]
197 }
198
View as plain text