Expand description
A fast, low-allocation CSV parser with optional serde support.
§Quick start
let data = b"name,age,city\nAlice,30,NYC\nBob,25,LA\n";
let mut reader = csv::Reader::from_bytes(data);
for row in reader.rows() {
for field in row.fields().unwrap() {
// field: &str — already unescaped, no surrounding quotes, `""` resolved
}
let fields: Vec<String> = row.all().unwrap();
}§Features
| Flag | Default | Description |
|---|---|---|
std | on | Enables std::io::Read, Writer, and std::error::Error impls. |
serde | off | Enables Row::deserialize() for #[derive(Deserialize)]. |
§Streaming from std::io::Read
use std::fs::File;
use csv::Reader;
let file = File::open("data.csv")?;
let mut reader = Reader::from_reader(file);
for row in reader.rows() {
let name = row.fields()?.next().unwrap();
println!("{name}");
}§Headers
use csv::Reader;
let data = b"name,age\nAlice,30\n";
let mut reader = Reader::from_reader(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::from_reader(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);
}When [parse_headers] is called before iterating, struct fields are
matched to CSV columns by name. Without it, fields are mapped positionally.
§Writer
use csv::Writer;
let mut w = Writer::new(Vec::new());
w.write_row(["name", "age"])?;
w.write_row(["Alice", "30"])?;
let bytes = w.into_inner()?;§Design
- Zero per-row allocations:
rows()reuses internal buffers. - Eager unescaping: quotes are stripped and
""resolved during parsing. - SIMD scanning: uses
memchr3to bulk-scan for delimiters, quotes, and newlines. - Borrowed rows:
Row<'_>borrows from theReaderand cannot outlive it. - Streaming: rows are parsed on-demand from
std::io::Read.
Structs§
- Fields
- A zero-allocation iterator over the fields of a
Row. - Read
Error - An error returned when parsing a CSV row.
- Reader
- Reads CSV data, either from a byte slice ([
from_bytes]) or from anystd::io::Readsource ([from_reader], requiresstdfeature). - Row
- A single row of CSV data.
- Rows
- An iterator over the rows of a CSV source.
- Writer
- Writes CSV data to a
std::io::Writesink.
Enums§
- Read
Error Kind - Kinds of errors that can occur while reading CSV data.
- Write
Error - An error returned when writing CSV data.