Expand description

csv-core provides a fast CSV reader and writer for use in a no_std context.

This crate will never use the standard library. no_std support is therefore enabled by default.

If you’re looking for more ergonomic CSV parsing routines, please use the csv crate.

Overview

This crate has two primary APIs. The Reader API provides a CSV parser, and the Writer API provides a CSV writer.

Example: reading CSV

This example shows how to count the number of fields and records in CSV data.

use csv_core::{Reader, ReadFieldResult};

let data = "
foo,bar,baz
a,b,c
xxx,yyy,zzz
";

let mut rdr = Reader::new();
let mut bytes = data.as_bytes();
let mut count_fields = 0;
let mut count_records = 0;
loop {
    // We skip handling the output since we don't need it for counting.
    let (result, nin, _) = rdr.read_field(bytes, &mut [0; 1024]);
    bytes = &bytes[nin..];
    match result {
        ReadFieldResult::InputEmpty => {},
        ReadFieldResult::OutputFull => panic!("field too large"),
        ReadFieldResult::Field { record_end } => {
            count_fields += 1;
            if record_end {
                count_records += 1;
            }
        }
        ReadFieldResult::End => break,
    }
}
assert_eq!(3, count_records);
assert_eq!(9, count_fields);

Example: writing CSV

This example shows how to use the Writer API to write valid CSV data. Proper quoting is handled automatically.

use csv_core::Writer;

// This is where we'll write out CSV data.
let mut out = &mut [0; 1024];
// The number of bytes we've written to `out`.
let mut nout = 0;
// Create a CSV writer with a default configuration.
let mut wtr = Writer::new();

// Write a single field. Note that we ignore the `WriteResult` and the number
// of input bytes consumed since we're doing this by hand.
let (_, _, n) = wtr.field(&b"foo"[..], &mut out[nout..]);
nout += n;

// Write a delimiter and then another field that requires quotes.
let (_, n) = wtr.delimiter(&mut out[nout..]);
nout += n;
let (_, _, n) = wtr.field(&b"bar,baz"[..], &mut out[nout..]);
nout += n;
let (_, n) = wtr.terminator(&mut out[nout..]);
nout += n;

// Now write another record.
let (_, _, n) = wtr.field(&b"a \"b\" c"[..], &mut out[nout..]);
nout += n;
let (_, n) = wtr.delimiter(&mut out[nout..]);
nout += n;
let (_, _, n) = wtr.field(&b"quux"[..], &mut out[nout..]);
nout += n;

// We must always call finish once done writing.
// This ensures that any closing quotes are written.
let (_, n) = wtr.finish(&mut out[nout..]);
nout += n;

assert_eq!(&out[..nout], &b"\
foo,\"bar,baz\"
\"a \"\"b\"\" c\",quux"[..]);

Structs

A pull based CSV reader.
Builds a CSV reader with various configuration knobs.
A writer for CSV data.
A builder for configuring a CSV writer.

Enums

The quoting style to use when writing CSV data.
The result of parsing at most one field from CSV data while ignoring the output.
The result of parsing at most one field from CSV data.
The result of parsing at most one record from CSV data while ignoring output.
The result of parsing at most one record from CSV data.
A record terminator.
The result of writing CSV data.

Functions

Returns true if and only if the given input is non-numeric.
Escape quotes input and writes the result to output.