This commit is contained in:
Executable
+54
@@ -0,0 +1,54 @@
|
||||
// Package csv provides utilities for loading and working with CSV data.
|
||||
package csv
|
||||
|
||||
import (
|
||||
"encoding/csv"
|
||||
"io"
|
||||
"os"
|
||||
|
||||
"git.sdf.org/jchenry/x"
|
||||
osx "git.sdf.org/jchenry/x/os"
|
||||
)
|
||||
|
||||
// CSV represents parsed CSV data with a header row and data rows.
|
||||
type CSV struct {
|
||||
// Header contains the column names from the first row
|
||||
Header []string
|
||||
// Data contains all remaining rows
|
||||
Data [][]string
|
||||
}
|
||||
|
||||
// LoadCSVFromFile loads CSV data from a file, treating the first row as a header.
|
||||
// The file must not be nil or this function will panic.
|
||||
// Returns the parsed CSV data or an error if reading fails.
|
||||
func LoadCSVFromFile(f *os.File) (c *CSV, err error) {
|
||||
x.Assert(f != nil, "LoadCSVFromFile: f is nil")
|
||||
csvFile := osx.FileOrStdin(f)
|
||||
defer csvFile.Close()
|
||||
return LoadCSVFromReader(csvFile)
|
||||
}
|
||||
|
||||
// LoadCSVFromReader loads CSV data from a reader, treating the first row as a header.
|
||||
// The reader must not be nil or this function will panic.
|
||||
// Returns the parsed CSV data or an error if reading fails.
|
||||
func LoadCSVFromReader(r io.Reader) (c *CSV, err error) {
|
||||
x.Assert(r != nil, "LoadCSVFromReader: r is nil")
|
||||
reader := csv.NewReader(r)
|
||||
|
||||
header, err := reader.Read()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
data, err := reader.ReadAll()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
csvData := &CSV{
|
||||
Header: header,
|
||||
Data: data,
|
||||
}
|
||||
|
||||
return csvData, nil
|
||||
}
|
||||
Reference in New Issue
Block a user