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