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[33], Level2: row[29], Level3: row[30], Description: row[44]} //Parse Rev rev, err := strconv.ParseFloat(row[72], 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[71], 10, 64) checkErr(err) new_data.Quantity = qty //Parse Time day, err := time.Parse("2006-01", row[26]) 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) }