Validate
Check that a .supr file conforms to the SuperCSV v1.0 spec — correct headers, valid types, well-formed data.
Install
Go SDK
Add the SuperCSV module to your project, then import the supr package.
go get github.com/supercsv/supercsv
import "github.com/supercsv/supercsv/supr"
Quick
Validate a File
Load and validate an entire file in one call. Returns the parsed header, any per-row errors, and fatal errors.
f, _ := os.Open("data.supr")
defer f.Close()
header, rowErrs, fatalErr := supr.ValidateFile(f)
if fatalErr != nil {
log.Fatal(fatalErr)
}
for _, err := range rowErrs {
fmt.Println(err) // per-row validation errors
}
if len(rowErrs) == 0 {
fmt.Println("Valid!", header.Columns)
}
Streaming
Row-by-Row
For large files, validate in constant memory. Errors are checked per-row as you iterate.
f, _ := os.Open("data.supr")
defer f.Close()
v := supr.NewValidator(f)
for v.Next() {
if err := v.RowError(); err != nil {
fmt.Println(err)
}
}
if err := v.Err(); err != nil {
log.Fatal(err)
}
if v.Valid() {
fmt.Println("All rows valid")
}
Options
Validator Options
Control error limits, field sizes, and version enforcement.
v := supr.NewValidator(f,
supr.WithMaxErrors(100),
supr.WithMaxFieldSize(1024*1024),
supr.WithStrictVersion("v1.0"), // require an explicit version directive matching v1.0
)
Full Round-Trip: Encode → Validate → Decode
// 1. Build a header
header := supr.NewHeader([]supr.Column{
{Name: "id", Type: supr.Int},
{Name: "name", Type: supr.String},
{Name: "score", Type: supr.Float},
{Name: "tags", Type: supr.List(supr.String)},
})
// 2. Encode rows to a buffer
rows := [][]any{
{int64(1), "Alice", 95.5, []any{"math", "sci"}},
{int64(2), "Bob", 87.3, []any{"art"}},
{int64(3), "Charlie", 92.1, []any{"math", "art", "music"}},
}
var buf bytes.Buffer
supr.EncodeFile(&buf, &supr.File{Header: header, Rows: rows})
// 3. Validate
_, rowErrs, fatalErr := supr.ValidateFile(strings.NewReader(buf.String()))
fmt.Println("Validation:", len(rowErrs), "errors")
// 4. Decode
d := supr.NewDecoder(strings.NewReader(buf.String()))
file, _ := d.DecodeFile()
for i, row := range file.Rows {
fmt.Printf("Row %d: id=%v name=%v score=%v tags=%v\n",
i, row[0], row[1], row[2], row[3])
}
id:int,name:string,score:float,tags:list<string>
1,Alice,95.5,[math,sci]
2,Bob,87.3,[art]
3,Charlie,92.1,[math,art,music]
Validation: 0 errors
Row 0: id = 1 name = Alice score = 95.5 tags = [math sci]
Row 1: id = 2 name = Bob score = 87.3 tags = [art]
Row 2: id = 3 name = Charlie score = 92.1 tags = [math art music]