A NEW STANDARD FOR DATA

A self‑describing, typed data format — read by humans, parsed by machines.

Type-Safe

Types

Every column declares its type in the header. No guessing, no inference, no surprises.

Name:string, Age:int, Active:bool,  mathType:string,   value:float

Alice      ,      30,       true,          "pi (π)",    3.141593
Bob        ,      25,      false,  square root of 2,    1.414214
Charlie    ,      41,       true,           sin 60°,    0.866025
Diana      ,      19,       true,                 φ,    1.618034
Evan       ,      33,      false,                 e,    2.718282
Minimal Quoting

Strings

Values are unquoted by default. Quotes are only needed when the value contains special characters.

Id:int, Unquoted:string, Quoted:string
1, hello world      , "hello, world"
2, simple           , "needs # quoting"
3, spaced 'valué'   , "contains [brackets]"
4, under_score      , "contains ""quotes"""
5, _                , ""  (null vs empty string)
6, Mixed cAse 55    , "semi;colon"
Data Lossless

Numbers

Integers, floats, and decimals are distinct types. Scientific notation, infinity, and NaN are first-class.

Id:int , Count:int , Ratio:float , Price:decimal
1      , 42        , 3.14        , 19.99
2      , -7        , 1e6         , 0.0001
3      , 0         , -inf        , 123456.789
4      , 9         , nan         , 42.0
5      , _         , 0.866025    , _
6      , 100       , 2.5e-3      , 0.50
Future Proof

Date and Time

Native date and time types with nanosecond precision. No more string-parsing ambiguity.

Id:int ,  Birthday:date , Start:time 
1      , 1990-05-12    , 14:30:00          
2      , 2024/02/29    , 08:15:42.5        
3      , 1999-12-31    , 23:59:59          
4      , _             , _                 
5      , 2025-01-01    , 00:00:00          
6      , 2023-10-10    , 12:00:00.123456789
Predictable

DateTime

Combined datetime and timestamp types with timezone support built in.

Id:int ,  Event:datetime           , Stamp:timestamp
1      , 2025-01-05 14:30:00      , 2025-01-05T14:30:00Z
2      , 2025/01/05 09:00:00.123  , 2025/01/05 09:00:00
3      , 2025-11-03T10:00:00      , _
4      , _                        , _
5      , 2025-01-01T00:00:00      , 2025-01-01T00:00:00+13:00
6      , 2025/01/05 14:30:00      , 2025/01/05 14:30:00Z
Human Friendly

Comments

Line comments, inline comments, and blank lines. Your data can document itself.

# People and their favourite colours
# line comments, (inline comments), and blank lines

Id:int,
Name:string (inline header comment),
Colour:enum<red,green,blue>

1      , Alice   (warm)         , red   (sunset red)
2      , Bob     (happy)        , green (apple)
3      , Charlie (stoic)        , blue  (sky blue)
4      , Dan     (fun)          , red   (rose)
5      , Eve     (sunny)        , _     (shiny)
6      , Frank   (neutral)      , green (neutral)

But It's Not Just Types And Comments...

Schema First

Enum One

Constrained value sets defined in the header. Invalid values are caught at parse time.

Id:int , Colour:enum<red,green,blue>
1      , red
2      , green
3      , blue
4      , red
5      , _
6      , green
Explicit Structure

Enum Two

Enum values can be text or numeric — use either the value or the name in your data.

Id:int,
Platform:enum<32=bbc,48=zx,777=fr,nym=db>
1      , zx
2      , 32
3      , bbc
4      , zx
5      , 777
6      , 48
7      , db
8      , nym
9      , _

There are also containers

Null is Explicit

List Dynamic

Variable-length typed lists. Null elements and null lists are distinct.

Id:int , Tags:list<string>
1      , [red,green]
2      , []
3      , [alpha,beta,gamma]
4      , [_,blue]
5      , [one]
6      , _
Intuitive

List Fixed

Fixed-length lists enforce exact element counts at the schema level.

Id:int , RGB:list<int>[3]
1      , [255,0,0]
2      , [0,255,0]
3      , [0,0,255]
4      , [_,128,255]
5      , [1,2,3]
6      , [0,0,0]
Consistent

Array Dynamic

Arrays for numeric data — variable length, strongly typed.

Id:int , Scores:arr<float>
1      , [1.1,2.2,3.3]
2      , []
3      , [0.5]
4      , [_,2.0,_]
5      , [10,20,30,40]
6      , _
Simple

Array Fixed

Fixed-size arrays with compile-time shape guarantees.

Id:int , Quad:arr<int>[4]
1      , [1,2,3,4]
2      , [_,_,_,_]
3      , [9,8,7,6]
4      , [0,1,0,1]
5      , [5,5,5,5]
6      , [3,2,1,0]
Whitespace Safe

Array Dynamic 2D

Nested arrays for matrices and multi-dimensional data.

Id:int , Matrix:arr<int>
1      , [[1,2],[3,4]]
2      , [[5,6,7],[8,9,10]]
3      , [[]]
4      , [[],[]]
5      , [ [ 9, 9],[9 ,9] ]
6      , _
Nulls by Design

Array Fixed 2D

Shape-constrained 2D arrays — the dimensions are part of the schema.

Id:int , Grid:arr<int>[2,3]
1      , [[1,2,3],[4,5,6]]
2      , [[_,_,_],[_,_,_]]
3      , [[9,8,7],[6,5,4]]
4      , [[0,1,2],[3,4,5]]
5      , [[10,11,12],[13,14,15]]
6      , [[3,3,3],[3,3,3]]
Unicode Friendly

Strict Machine First Mode

A stripped-down mode for streaming machine-to-machine transfer — no whitespace padding, no comments, maximum throughput.

((SuperCSV v1.0))
Id:int,Active:bool,Platform:enum<32=bbc,48=zx,777=fr>
1,1,32
2,0,48
3,1,777
4,1,48
5,0,32
6,1,_

A whole lot of everything example

# A whole lot of everything example demonstrating comments, blank lines, nulls, enums, and constrained containers
( -------------------------------------------------------------- )

# Header mixes enums, lists, fixed-length arrays, shape-constrained arrays, and prefixed arrays
Id:int, Name:string, Status:enum<0=pending,1=active,2=archived>, (header can wrap)
 Tags:list<string>, Scores:arr<float>[3], Matrix:arr<int>[2,2], Extras:arr<int>, Notes:string

# Blank line above intentionally left empty

1, "Eve", 1, [alpha,beta], [3.5,4.0,4.5], [[1,2],[3,4]], [4][10,20,30,40], "First row"

# Using numeric enum literal and null notes
2, Dan, 0, [gamma,_], [1.0,2.0,3.0], [[0,1],[1,0]], [3][5,15,25], _

# Null enum, null inside fixed-length array, null inside matrix
3, George, _, [delta], [_,0.0,1.0], [[_,2],[3,_]], [], "Nulls allowed"

# Data Rows can wrap
4, Yves, 2, [a,b,c,d,e,f], (rows can wrap)
[-1.0,0.0,1.0], [[1,3],[3,7]], (see)
[3,6,9], "Final Row"

and stripped down

((SuperCSV v1.0))
Id:int,Name:string,Status:enum<0=pending,1=active,2=archived>,Tags:list<string>,Scores:arr<float>[3],Matrix:arr<int>[2,2],Extras:arr<int>,Notes:string
1,"Eve",1,[alpha,beta],[3.5,4.0,4.5],[[1,2],[3,4]],[4][10,20,30,40],"First row"
2,Dan,0,[gamma,_],[1.0,2.0,3.0],[[0,1],[1,0]],[3][5,15,25],_
3,George,_,[delta],[_,0.0,1.0],[[_,2],[3,_]],[],"Nulls allowed"
4,Yves,2,[a,b,c,d,e,f],[-1.0,0.0,1.0],[[1,3],[3,7]],[3][3,6,9],"Final Row"

Small and Tiny Type Aliases

# default types
name:string, age:int, simplex:arr<int>, base:arr<float>

# small
name:str, age:int, simplex:ar<int>, base:ar<flt>

# tiny
name:s, age:i, simplex:a<i>, base:a<f>

SuperCSV was crafted in Aotearoa New Zealand with aroha and whakapau kaha.