@Sergio_Hunter

Как правильно использовать sort в Go?

Здравствуйте. Подскажите пожалуйста, мне нужно чтоб сортировало по датам перед тем как выгружалось в csv. Как в моем случае использовать пакет sort. Что именно использовать sort.String или sort.Sort и методов Len, Less, и Swap? Спасибо.

package main

import (
	"bytes"
	"compress/zlib"
	"database/sql"
	"encoding/csv"
	"encoding/json"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"io/ioutil"
	"log"
	"os"
	"strconv"
)

type UserStatsData struct {
	Dates map[string]Info `json:"d"`
}

type Info struct {
	Date    string  `json:"-"`
	Gold    int     `json:"g"`
	Revenue float64 `json:"r"`
	H       []Info  `json:"h"`
}

func main() {
	var data []byte

	db, err := sql.Open("mysql", "name:password@tcp(127.0.0.1:9011)/database")
	if err != nil {
		panic(err.Error())
	}
	defer db.Close()

	rows, err := db.Query(`SELECT data FROM user_stats ORDER BY created_at DESC LIMIT 1000`)
	if err != nil {
		log.Fatal(err)
	}
	defer rows.Close()

	file, err := os.Create("result.csv")
	if err != nil {
		fmt.Println(err)
	}
	defer file.Close()

	writer := csv.NewWriter(file)
	var record []string
	record = append(record, "Date")
	record = append(record, "Gold")
	record = append(record, "Revenue")
	writer.Write(record)

	var userStatsDataArr []UserStatsData
	for rows.Next() {
		err := rows.Scan(&data)
		if err != nil {
			log.Fatal(err)
		}

		var userStatsData UserStatsData
		err = json.Unmarshal(data, &userStatsData)
		if err != nil {
			r, err := zlib.NewReader(bytes.NewReader(data))
			if err != nil {
				log.Panicf("\nCannot read archive %v", err)
			}
			r.Close()
			data, _ = ioutil.ReadAll(r)

			err = json.Unmarshal(data, &userStatsData)
			if err != nil {
				panic(err.Error())
			}

		}

		userStatsDataArr = append(userStatsDataArr, userStatsData)

	}
	parsed := make(map[string]Info)
	for _, user := range userStatsDataArr {
		for k, v := range user.Dates {
			if item, ok := parsed[k]; ok {
				item.Gold += v.Gold
				item.Revenue += v.Revenue
				parsed[k] = item
			} else {
				parsed[k] = v
			}
			for _, val := range v.H {
				if item, ok := parsed[val.Date]; ok {
					item.Gold += val.Gold
					item.Revenue += val.Revenue
					parsed[val.Date] = item
				} else {
					parsed[k] = val
				}

			}

		}

	}

	for k, v := range parsed {
		var record []string
		record = append(record, k)
		record = append(record, strconv.Itoa(v.Gold))
		record = append(record, fmt.Sprintf("%.2f", v.Revenue))
		writer.Write(record)
	}

	writer.Flush()

}
  • Вопрос задан
  • 222 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 нояб. 2024, в 08:04
1 руб./за проект
22 нояб. 2024, в 06:06
1500 руб./в час
22 нояб. 2024, в 06:04
1 руб./за проект