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
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"
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
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
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
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...
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
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
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 , _
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]
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 , _
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]
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 , _
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]]
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>