Skip to main content

Crate csv_legacy2

Crate csv_legacy2 

Source
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

FlagDefaultDescription
stdonEnables std::io::Read, Writer, and std::error::Error impls.
serdeoffEnables 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 memchr3 to bulk-scan for delimiters, quotes, and newlines.
  • Borrowed rows: Row<'_> borrows from the Reader and 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.
ReadError
An error returned when parsing a CSV row.
Reader
Reads CSV data, either from a byte slice ([from_bytes]) or from any std::io::Read source ([from_reader], requires std feature).
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::Write sink.

Enums§

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