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
| Flag | Default | Description |
|---|---|---|
std | on | Enables std::io::Read support for Reader, Writer, and std::error::Error impls. |
serde | off | Enables 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:
RowandBytesRowown their data. Rows can outlive theReader. - Single buffer: Each row stores all fields contiguously in one
Vec<u8>. - SIMD scanning: uses
memchr3to bulk-scan for delimiters, quotes, and newlines. - Deferred errors: Row parsing errors are stored in the row and surfaced on access.
- BytesRow / Row split:
BytesRowworks with raw bytes;Rowadds UTF-8 validation. - Streaming: rows are parsed on-demand from any
Readsource.
Structs§
- Bytes
Fields - Bytes
Row - Bytes
Rows - Field
Range - Fields
- Read
Error - An error returned when parsing a CSV row.
- Reader
- A pull-based CSV reader that parses records from any
Readsource. - Row
- Rows
- Writer
- Writes CSV data to a
Writesink.
Enums§
- Read
Error Kind - Kinds of errors that can occur while reading CSV data.
- Write
Error - An error returned when writing CSV data.