cue-lang / docs-and-content

A place to discuss, plan, and track documentation on cuelang.org
5 stars 1 forks source link

docs/howto/validate-csv-files: Validating CSV files #100

Open jpluscplusm opened 3 months ago

jpluscplusm commented 3 months ago

Taking the toy data from https://alpha.cuelang.org/docs/howto/use-encoding-csv-decode-to-access-data-stored-in-a-csv-file/, we could document this approach of validating data in CSV files with cue vet.

Downsides:

exec cue vet file.cue text: good-1.csv good-2.csv -d '#CSV'
! exec cue vet file.cue text: good-1.csv  good-2.csv bad.csv -d '#CSV'
cmp stderr failure
-- file.cue --
import (
    "encoding/csv"
    "list"
    "strconv"
)

#CSV: X={
    string
    _contents: csv.Decode(X)
    _header:   list.Take(_contents, 1)
    _data:     list.Drop(_contents, 1)
    _data: [...#Data]
}

#Data: [#Id, #Name, #Location, #Species]

#Id:       string
#Name:     string & != ""
#Location: string
#Species:  string

#Id: X={"\(strconv.Atoi(X))"}
-- good-1.csv --
Id,Name,Location,Species
1,Charlie,"Ripon, North Yorkshire",cat
2,Fred,San Francisco,cat
3,Greyfriars Bobby,Edinburgh,dog
4,Nemo,???,fish
-- good-2.csv --
Id,Name,Location,Species
1,Fred,San Francisco,cat
2,Charlie,"Ripon, North Yorkshire",cat
3,Nemo,???,fish
4,Greyfriars Bobby,Edinburgh,dog
-- bad.csv --
Id,Name,Location,Species
1,Nemo,???,fish
a,Greyfriars Bobby,Edinburgh,dog
b,Fred,San Francisco,cat
4,,"Ripon, North Yorkshire",cat
-- failure --
_data.3.1: invalid value "" (out of bound !=""):
    ./file.cue:18:21
    ./file.cue:9:13
    ./file.cue:15:14
_data.1.0: invalid interpolation: error in call to strconv.Atoi: strconv.Atoi: parsing "a": invalid syntax:
    ./file.cue:22:9
    ./file.cue:22:12
_data.2.0: invalid interpolation: error in call to strconv.Atoi: strconv.Atoi: parsing "b": invalid syntax:
    ./file.cue:22:9
    ./file.cue:22:12