Files
xl/runner/process_excel.go

93 lines
2.3 KiB
Go

package runner
import (
"fmt"
"strconv"
"strings"
"time"
"database/sql"
_ "github.com/mattn/go-sqlite3"
"github.com/xuri/excelize/v2"
_ "embed"
)
//go:embed sql/schema.sql
var schema string
type Data struct {
Description string `db:"description,omitempty"`
SKU string `db:"sku,omitempty"`
Level2 string `db:"level2,omitempty"`
Level3 string `db:"level3,omitempty"`
Revenue float64 `db:"revenue,omitempty"`
Cost float64 `db:"cost,omitempty"`
Quantity int64 `db:"quantity,omitempty"`
Year int64 `db:"year,omitempty"`
Month int64 `db:"month,omitempty"`
Trend sql.NullFloat64 `db:"trend,omitempty"`
}
func (r *Runner) ProcessExcel(path string) {
fmt.Println("Processing excel file...")
start := time.Now()
f, err := excelize.OpenFile(path)
checkErr(err)
rows, err := f.GetRows("Sheet1")
checkErr(err)
const offset = 3
data := []Data{}
for i, row := range rows {
if i >= offset {
new_data := Data{SKU: row[34], Level2: row[30], Level3: row[31], Description: row[45]}
//Parse Rev
rev, err := strconv.ParseFloat(row[75], 64)
checkErr(err)
new_data.Revenue = rev
//Parse Cost
cost, err := strconv.ParseFloat(row[16], 64)
checkErr(err)
new_data.Cost = cost
//Parse Quantity
qty, err := strconv.ParseInt(row[74], 10, 64)
checkErr(err)
new_data.Quantity = qty
//Parse Time
day, err := time.Parse("2006-01", row[27])
checkErr(err)
new_data.Year = int64(day.Year())
new_data.Month = int64(day.Month())
data = append(data, new_data)
}
}
db, err := sql.Open("sqlite3", "data.db")
checkErr(err)
defer db.Close()
db.Exec("DROP TABLE IF EXISTS data")
db.Exec(schema)
values := []string{}
for _, elm := range data {
values = append(values, fmt.Sprintf(`("%s","%s","%s","%s",%f,%f,%d,"%d","%d",%f)`, strings.ReplaceAll(elm.Description, "\"", ""), elm.SKU, elm.Level2, elm.Level3, elm.Revenue, elm.Cost, elm.Quantity, elm.Year, elm.Month, 0.0))
}
stmt := "INSERT INTO data (description,sku,level2,level3,revenue,cost,quantity,year,month,trend) VALUES " + strings.Join(values, ",")
_, err = db.Exec(stmt)
checkErr(err)
elapsed := time.Since(start)
fmt.Printf("Operation complete in %s\n", elapsed)
}