IETF Internet-Draft · draft-mscaldas-csvpp-02

CSV++

An extension to RFC 4180 that adds arrays and nested structures to CSV — while remaining fully compatible with every existing CSV parser.

contacts.csvpp
4
Delimiter levels
100%
Backward compatible
RFC
IETF standard track
UTF-8
Default encoding

Where CSV++ fits in

The sweet spot between flat CSV and fully hierarchical formats — bringing structure without sacrificing simplicity or compatibility.

CSV++
JSON
XML
CSV

Built for real-world data

The CSV format you already know, extended to handle the complexity of modern datasets.

Backward Compatible

Standard CSV parsers read CSV++ files without errors. Your existing toolchain works from day one.

Hierarchical Data

Arrays and nested structures compose recursively. Represent real-world data without JSON's verbosity.

Self-Documenting

Structure is declared in column headers — files are human-readable with no external schema needed.

Simple Syntax

field[] for arrays, field^(a^b) for structures. Declarative and intuitive.

Bandwidth Efficient

Columnar format avoids repeating field names in every record. Smaller files than JSON or XML.

IETF Standardized

Formally specified as an IETF Internet-Draft — interoperable, unambiguous, and implementation-ready.

See it in action

Multiple phone numbers and structured addresses in a single, readable CSV file.

# Column headers declare the structure of each field
id,name,phones[],address^(street^city^state^zip)
1,John Smith,555-1234~555-5678,123 Main St^Los Angeles^CA^90210
2,Jane Doe,555-4444,789 Pine St^Boston^MA^02101

phones[] declares a tilde-delimited array field. address^(…) declares a caret-separated structured field. Standard CSV parsers read this file without modification.

CSV++ (CSV Plus Plus)

CSV++ is an extension to the Comma-Separated Values format defined in RFC 4180. It adds support for repeating fields (one-to-many relationships) and hierarchical component structures while maintaining backward compatibility with standard CSV parsers.

The Problem

Traditional CSV excels at flat, tabular data. But real-world data often contains:

  • Repeated values — e.g., multiple phone numbers per person
  • Structured components — e.g., addresses with street, city, state, zip
  • Nested hierarchies — e.g., multiple structured addresses per record

The Solution

Formats like JSON, XML, and YAML represent hierarchical data well — but introduce complexity and redundancy that may not be warranted for moderately structured datasets. CSV++ occupies the middle ground: extending CSV's tabular simplicity with hierarchical capabilities.

Structure is declared in column headers using a minimal syntax: field[] for arrays, field^(comp1^comp2) for structured fields. Data uses configurable delimiters chosen to avoid conflicts with common data.

Design Principles

01
Backward Compatibility — Standard CSV parsers can read CSV++ files without modification
02
Self-Documenting — Structure is entirely defined in column headers
03
Tabular Readability — Data maintains a tabular layout suitable for spreadsheets
04
Explicit Over Implicit — Delimiters are declared, not assumed
05
Recursively Composable — Structures nest to any depth; 3–4 levels recommended

When to Use CSV++

CSV++ is most appropriate for:

  • Moderately structured data (1–3 levels of nesting)
  • Environments where CSV is the established interchange format
  • Scenarios requiring backward compatibility with existing CSV infrastructure
  • Applications that benefit from self-documenting tabular data
  • Large datasets where file size and bandwidth matter

Note: for deeply nested hierarchical data (4+ levels), document-oriented formats like JSON or XML may provide better readability and tooling support.

→ Read the Full Specification — draft-mscaldas-csvpp-02 (IETF Datatracker)

Frequently Asked Questions

Get in touch

Questions or feedback?

Whether you're interested in implementing the spec, have questions about the format design, or want to contribute — we'd love to hear from you.

You can also submit feedback through the IETF Datatracker or read the draft.