From 9ce6da7745b91d57dd5674cf3b6362848e1f4234 Mon Sep 17 00:00:00 2001 From: Jonas Leder <jonas@jonasled.de> Date: Sat, 25 Jan 2025 13:14:54 +0100 Subject: [PATCH] create CSV writer --- .gitignore | 3 ++- csv/main.go | 48 +++++++++++++++++++++++++++++++++++++++++++ helper/anyToString.go | 16 +++++++++++++++ 3 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 csv/main.go create mode 100644 helper/anyToString.go diff --git a/.gitignore b/.gitignore index 2eea525..998ebd1 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -.env \ No newline at end of file +.env +boiler.csv \ No newline at end of file diff --git a/csv/main.go b/csv/main.go new file mode 100644 index 0000000..1ddd840 --- /dev/null +++ b/csv/main.go @@ -0,0 +1,48 @@ +package csv + +import ( + "encoding/csv" + "encoding/json" + "os" + + "jonasled.dev/jonasled/ems-esp-logger/helper" +) + +func JsonToCsv(jsonData string) { + var data map[string]interface{} + if err := json.Unmarshal([]byte(jsonData), &data); err != nil { + panic(err) + } + + file, err := os.OpenFile(os.Getenv("OUTPUT_FILE_NAME"), os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + panic(err) + } + defer file.Close() + + writer := csv.NewWriter(file) + defer writer.Flush() + + fileInfo, err := file.Stat() + if err != nil { + panic(err) + } + + if fileInfo.Size() == 0 { + header := make([]string, 0, len(data)) + for key := range data { + header = append(header, key) + } + if err := writer.Write(header); err != nil { + panic(err) + } + } + + row := make([]string, 0, len(data)) + for _, value := range data { + row = append(row, helper.AnyToString(value)) + } + if err := writer.Write(row); err != nil { + panic(err) + } +} diff --git a/helper/anyToString.go b/helper/anyToString.go new file mode 100644 index 0000000..7b7e728 --- /dev/null +++ b/helper/anyToString.go @@ -0,0 +1,16 @@ +package helper + +import "fmt" + +func AnyToString(value interface{}) string { + switch v := value.(type) { + case string: + return v + case float64: + return fmt.Sprintf("%.2f", v) + case int: + return fmt.Sprintf("%d", v) + default: + return "" + } +} -- GitLab