62 lines
1.1 KiB
Go
62 lines
1.1 KiB
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"encoding/csv"
|
|
"encoding/json"
|
|
"flag"
|
|
"log/slog"
|
|
"os"
|
|
"slices"
|
|
)
|
|
|
|
func main() {
|
|
var outf string
|
|
flag.StringVar(&outf, "o", "idle_single_mode.csv", "output CSV `file`")
|
|
flag.Parse()
|
|
|
|
out, err := os.Create(outf)
|
|
if err != nil {
|
|
slog.Error("create output", slog.Any("err", err))
|
|
os.Exit(1)
|
|
}
|
|
b := bufio.NewWriter(out)
|
|
defer b.Flush()
|
|
w := csv.NewWriter(b)
|
|
defer w.Flush()
|
|
if err := w.Write(headers); err != nil {
|
|
slog.Error("write header", slog.Any("err", err))
|
|
}
|
|
|
|
files := flag.Args()
|
|
slices.Sort(files)
|
|
for _, in := range files {
|
|
dofile(w, in)
|
|
}
|
|
}
|
|
|
|
func dofile(w *csv.Writer, name string) {
|
|
log := slog.With(slog.String("file", name))
|
|
log.Info("process")
|
|
f, err := os.Open(name)
|
|
if err != nil {
|
|
log.Error("open", slog.Any("err", err))
|
|
return
|
|
}
|
|
defer f.Close()
|
|
|
|
var ism WorkIdleSingleMode
|
|
d := json.NewDecoder(f)
|
|
d.DisallowUnknownFields()
|
|
if err := d.Decode(&ism); err != nil {
|
|
log.Error("decode", slog.Any("err", err))
|
|
return
|
|
}
|
|
|
|
for row := range ismRows(name, ism) {
|
|
if err := w.Write(row.csv()); err != nil {
|
|
log.Error("write row", slog.Any("err", err))
|
|
}
|
|
}
|
|
}
|