Files
gokeystat/saving.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)
}