225 lines
5.7 KiB
Go
225 lines
5.7 KiB
Go
// saving.go
|
|
package main
|
|
|
|
import (
|
|
"compress/gzip"
|
|
"encoding/csv"
|
|
"encoding/json"
|
|
"io"
|
|
"log"
|
|
"os"
|
|
"strconv"
|
|
)
|
|
|
|
// SaveToCsvWriter saves data to writerOut
|
|
// if fullExport saves log for each key else only sum for keys
|
|
func SaveToCsvWriter(data []StatForTime, keyMap map[uint8]string, writerOut io.Writer, fullExport bool) {
|
|
|
|
numKeysInt := GetKeyNumsFromKeyMap(keyMap)
|
|
|
|
var numKeys []uint8
|
|
for _, key := range numKeysInt {
|
|
numKeys = append(numKeys, uint8(key))
|
|
}
|
|
|
|
var titleLine []string
|
|
|
|
titleLine = append(titleLine, "Time")
|
|
if fullExport {
|
|
for _, key := range numKeys {
|
|
titleLine = append(titleLine, keyMap[key])
|
|
}
|
|
}
|
|
titleLine = append(titleLine, "Sum")
|
|
|
|
var table [][]string
|
|
|
|
table = append(table, titleLine)
|
|
for _, rec := range data {
|
|
var line []string
|
|
line = append(line, strconv.Itoa(int(rec.time)))
|
|
var sum int
|
|
for _, key := range numKeys {
|
|
sum += rec.keys[key]
|
|
if fullExport {
|
|
line = append(line, strconv.Itoa(rec.keys[key]))
|
|
}
|
|
}
|
|
line = append(line, strconv.Itoa(sum))
|
|
table = append(table, line)
|
|
}
|
|
|
|
writer := csv.NewWriter(writerOut)
|
|
writer.WriteAll(table)
|
|
}
|
|
|
|
// SaveToCsvFile saves data to path
|
|
// if fullExport saves log for each key else only sum for keys
|
|
func SaveToCsvFile(data []StatForTime, keyMap map[uint8]string, path string, fullExport bool) {
|
|
csvfile, err := os.Create(path)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
return
|
|
}
|
|
defer csvfile.Close()
|
|
|
|
SaveToCsvWriter(data, keyMap, csvfile, fullExport)
|
|
}
|
|
|
|
// SaveToJSONWriter saves data to writerOut
|
|
// if fullExport saves log for each key else only sum for keys
|
|
// Save in one Json array
|
|
func SaveToJSONWriter(data []StatForTime, keyMap map[uint8]string, writerOut io.Writer, fullExport bool) {
|
|
type JSONStatForTime struct {
|
|
Time int64
|
|
Keys map[string]int
|
|
}
|
|
|
|
table := make([]JSONStatForTime, len(data))
|
|
for i, stat := range data {
|
|
table[i].Keys = make(map[string]int)
|
|
|
|
table[i].Time = stat.time
|
|
var sum int
|
|
for numKey, key := range keyMap {
|
|
if fullExport {
|
|
table[i].Keys[key] = stat.keys[numKey]
|
|
}
|
|
sum += stat.keys[numKey]
|
|
}
|
|
table[i].Keys["sum"] = sum
|
|
}
|
|
|
|
outString, err := json.Marshal(table)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
writerOut.Write(outString)
|
|
}
|
|
|
|
// SaveToJSONFile saves data to path
|
|
// if fullExport saves log for each key else only sum for keys
|
|
// Save in one Json array
|
|
func SaveToJSONFile(data []StatForTime, keyMap map[uint8]string, path string, fullExport bool) {
|
|
jsonFile, err := os.Create(path)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer jsonFile.Close()
|
|
|
|
SaveToJSONWriter(data, keyMap, jsonFile, fullExport)
|
|
}
|
|
|
|
// SaveToJSLWriter saves data to writerOut
|
|
// if fullExport saves log for each key else only sum for keys
|
|
// Each record on new line
|
|
func SaveToJSLWriter(data []StatForTime, keyMap map[uint8]string, writerOut io.Writer, fullExport bool) {
|
|
type JSLStatForTime struct {
|
|
Time int64
|
|
Keys map[string]int
|
|
}
|
|
|
|
table := make([]JSLStatForTime, len(data))
|
|
for i, stat := range data {
|
|
table[i].Keys = make(map[string]int)
|
|
|
|
table[i].Time = stat.time
|
|
var sum int
|
|
for numKey, key := range keyMap {
|
|
if fullExport {
|
|
table[i].Keys[key] = stat.keys[numKey]
|
|
}
|
|
sum += stat.keys[numKey]
|
|
}
|
|
table[i].Keys["sum"] = sum
|
|
}
|
|
|
|
for ind, line := range table {
|
|
lineBytes, err := json.Marshal(line)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
writerOut.Write(lineBytes)
|
|
if ind != len(table)-1 {
|
|
writerOut.Write([]byte("\n"))
|
|
}
|
|
}
|
|
}
|
|
|
|
// SaveToJSLFile saves data to path
|
|
// if fullExport saves log for each key else only sum for keys
|
|
// Each record on new line
|
|
func SaveToJSLFile(data []StatForTime, keyMap map[uint8]string, path string, fullExport bool) {
|
|
jslFile, err := os.Create(path)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer jslFile.Close()
|
|
|
|
SaveToJSLWriter(data, keyMap, jslFile, fullExport)
|
|
}
|
|
|
|
// SaveToCsvGzWriter same as SaveToCsvWriter but gunzip file before saving
|
|
func SaveToCsvGzWriter(data []StatForTime, keyMap map[uint8]string, writerOut io.Writer, fullExport bool) {
|
|
gzipWriter := gzip.NewWriter(writerOut)
|
|
defer gzipWriter.Close()
|
|
|
|
SaveToCsvWriter(data, keyMap, gzipWriter, fullExport)
|
|
}
|
|
|
|
// SaveToCsvGzFile same as SaveToCsvFile but gunzip file before saving
|
|
func SaveToCsvGzFile(data []StatForTime, keyMap map[uint8]string, path string, fullExport bool) {
|
|
jsonFile, err := os.Create(path)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer jsonFile.Close()
|
|
|
|
gzipWriter := gzip.NewWriter(jsonFile)
|
|
defer gzipWriter.Close()
|
|
|
|
SaveToCsvWriter(data, keyMap, gzipWriter, fullExport)
|
|
}
|
|
|
|
// SaveToJSONGzWriter same as SaveToJSONWriter but gunzip file before saving
|
|
func SaveToJSONGzWriter(data []StatForTime, keyMap map[uint8]string, writerOut io.Writer, fullExport bool) {
|
|
gzipWriter := gzip.NewWriter(writerOut)
|
|
defer gzipWriter.Close()
|
|
|
|
SaveToJSONWriter(data, keyMap, gzipWriter, fullExport)
|
|
}
|
|
|
|
// SaveToJSONGzFile same as SaveToJSONFile but gunzip file before saving
|
|
func SaveToJSONGzFile(data []StatForTime, keyMap map[uint8]string, path string, fullExport bool) {
|
|
jsonFile, err := os.Create(path)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer jsonFile.Close()
|
|
|
|
gzipWriter := gzip.NewWriter(jsonFile)
|
|
defer gzipWriter.Close()
|
|
|
|
SaveToJSONWriter(data, keyMap, gzipWriter, fullExport)
|
|
}
|
|
|
|
// SaveToJSLGzWriter same as SaveToJSLWriter but gunzip file before saving
|
|
func SaveToJSLGzWriter(data []StatForTime, keyMap map[uint8]string, writerOut io.Writer, fullExport bool) {
|
|
gzipWriter := gzip.NewWriter(writerOut)
|
|
defer gzipWriter.Close()
|
|
|
|
SaveToJSLWriter(data, keyMap, gzipWriter, fullExport)
|
|
}
|
|
|
|
// SaveToJSLGzFile same as SaveToJSLFile but gunzip file before saving
|
|
func SaveToJSLGzFile(data []StatForTime, keyMap map[uint8]string, path string, fullExport bool) {
|
|
jslFile, err := os.Create(path)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer jslFile.Close()
|
|
|
|
SaveToJSLGzWriter(data, keyMap, jslFile, fullExport)
|
|
}
|