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.ProgressLog) { if err := w.Write(row.csv()); err != nil { log.Error("write row", slog.Any("err", err)) } } }