forked from UNN/2026-rff_mp
- Функция создания пустого файла - Разобрался с директорией для сохранения файла
82 lines
1.9 KiB
Go
82 lines
1.9 KiB
Go
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 пишет всё сразу
|
||
}
|