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