package csvwriter import ( "encoding/csv" "fmt" "os" "path/filepath" ) type BenchmarkResult struct { Structure string Mode string Operation string Time float64 } func (b *BenchmarkResult) ToString() string { return fmt.Sprintf("%s %s %s %f", b.Structure, b.Mode, b.Operation, b.Time) } func (b *BenchmarkResult) ToStrings() []string { return []string{b.Structure, b.Mode, b.Operation, fmt.Sprintf("%f", b.Time)} } // Создаём пустой csv файл с заголовками func CreateEmptyCSV(dir, name string) error { filename := filepath.Join(dir, name) file, err := os.Create(filename) if err != nil { return err } defer file.Close() writer := csv.NewWriter(file) defer writer.Flush() header := []string{"Structure", "Mode", "Operation", "Time"} writer.Write(header) return writer.Error() } // AppendRaw дописывает произвольные строки в CSV func AppendRaw(results []BenchmarkResult) error { filename := filepath.Join("results", "benchmarks.csv") fileExists := true isEmpty := true if info, err := os.Stat(filename); err == nil { isEmpty = info.Size() == 0 } else if os.IsNotExist(err) { fileExists = false } file, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { return err } defer file.Close() writer := csv.NewWriter(file) defer writer.Flush() // Если файл новый или пустой, записываем заголовки if !fileExists || isEmpty { header := []string{"Structure", "Mode", "Operation", "Time"} if err := writer.Write(header); err != nil { return fmt.Errorf("не удалось записать заголовки: %w", err) } } rows := make([][]string, len(results)) for i, res := range results { rows[i] = res.ToStrings() // fmt.Println(res.ToStrings()) } return writer.WriteAll(rows) // WriteAll пишет всё сразу }