github.com/benoitkugler/goacve@v0.0.0-20201217100549-151ce6e55dc8/server/core/utils/table/csv.go (about)

     1  package table
     2  
     3  import (
     4  	"encoding/csv"
     5  	"fmt"
     6  	"io"
     7  	"os"
     8  	"path/filepath"
     9  
    10  	rd "github.com/benoitkugler/goACVE/server/core/rawdata"
    11  )
    12  
    13  // GenerateCsv génère un .csv et écrit dans `out`
    14  func GenerateCsv(headers []rd.Header, liste rd.Table, out io.Writer) error {
    15  	data := make([][]string, len(liste))
    16  	for i, item := range liste {
    17  		row := make([]string, len(headers))
    18  		for j, header := range headers {
    19  			row[j] = item.Fields.Data(header.Field).String()
    20  		}
    21  		data[i] = row
    22  	}
    23  	writer := csv.NewWriter(out)
    24  	err := writer.WriteAll(data)
    25  	if err != nil {
    26  		return fmt.Errorf("Erreur pendant l'écriture de l'export CSV : %s", err)
    27  	}
    28  	return nil
    29  }
    30  
    31  // ExportCsv génère et enregistre un .csv à partir de la liste et des champs fournis
    32  func ExportCsv(headers []rd.Header, liste rd.Table, directory string) (path string, err error) {
    33  	path, err = filepath.Abs(filepath.Join(directory, "export.csv"))
    34  	if err != nil {
    35  		return "", fmt.Errorf("Chemin du dossier invalide: %s", err)
    36  	}
    37  	f, err := os.Create(path)
    38  	if err != nil {
    39  		return "", fmt.Errorf("Création du fichier d'export impossible : %s", err)
    40  	}
    41  	defer f.Close()
    42  
    43  	if err = GenerateCsv(headers, liste, f); err != nil {
    44  		return "", err
    45  	}
    46  	return path, nil
    47  }