Skip to main content

Crate csv

Crate csv 

Source
Expand description

A fast, low-allocation CSV parser with no_std and serde support.

§Quick start

let data: &[u8] = b"name,age,city\nAlice,30,NYC\nBob,25,LA\n";
let mut reader = csv::Reader::new(data);

for row in reader.rows() {
    for field in row.iter() {
        let field: &str = field.unwrap();
    }
    let fields: Vec<&str> = row.to_vec().unwrap();
}

§Features

FlagDefaultDescription
stdonEnables std::io::Read support for Reader, Writer, and std::error::Error impls.
serdeoffEnables Row::deserialize() + Writer::serialize() for serde support.

§Streaming from any Read source

use std::fs::File;
use csv::Reader;

let file = File::open("data.csv")?;
let mut reader = Reader::new(file);

for row in reader.rows() {
    let name = row.get(0).unwrap().unwrap();
    println!("{name}");
}

§Headers

use csv::Reader;
let data = b"name,age\nAlice,30\n";
let mut reader = Reader::new(std::io::Cursor::new(data));
let headers = reader.parse_headers()?;
for row in reader.rows() {
}

§Serde (requires serde feature)

use csv::Reader;
use serde::Deserialize;

#[derive(Deserialize)]
struct Record {
    name: String,
    age: u32,
}

let mut reader = Reader::new(std::io::Cursor::new(b"name,age\nAlice,30\n"));
reader.parse_headers()?;

for row in reader.rows() {
    let rec: Record = row.deserialize()?;
    println!("{} is {}", rec.name, rec.age);
}

§Writer

use csv::Writer;

let mut w = Writer::new(Vec::new());
w.write_headers(["name", "age"])?;
w.write_row(["Alice", "30"])?;
let bytes = w.into_inner()?;

With serde:

use csv::Writer;
use serde::Serialize;

#[derive(Serialize)]
struct Person { name: String, age: u32 }

let mut w = Writer::new(Vec::new())
    .set_headers(vec!["name".into(), "age".into()]);
let p = Person { name: "Alice".into(), age: 30 };
w.serialize(&p)?;

§Design

  • Owned rows: Row and BytesRow own their data. Rows can outlive the Reader.
  • Single buffer: Each row stores all fields contiguously in one Vec<u8>.
  • SIMD scanning: uses memchr3 to bulk-scan for delimiters, quotes, and newlines.
  • Deferred errors: Row parsing errors are stored in the row and surfaced on access.
  • BytesRow / Row split: BytesRow works with raw bytes; Row adds UTF-8 validation.
  • Streaming: rows are parsed on-demand from any Read source.

Structs§

BytesFields
BytesRow
BytesRows
FieldRange
Fields
ReadError
An error returned when parsing a CSV row.
Reader
A pull-based CSV reader that parses records from any Read source.
Row
Rows
Writer
Writes CSV data to a Write sink.

Enums§

ReadErrorKind
Kinds of errors that can occur while reading CSV data.
WriteError
An error returned when writing CSV data.

Traits§

Read
Custom read abstraction that allows Reader to work without std::io::Read.
Write
Custom write abstraction that allows Writer to work without std::io::Write.