Crates.io | csv-core |
lib.rs | csv-core |
version | 0.1.11 |
source | src |
created_at | 2017-05-23 01:28:33.952564 |
updated_at | 2023-10-03 13:15:01.155842 |
description | Bare bones CSV parsing with no_std support. |
homepage | https://github.com/BurntSushi/rust-csv |
repository | https://github.com/BurntSushi/rust-csv |
max_upload_size | |
id | 15639 |
size | 120,662 |
A fast CSV reader and write for use in a no_std
context. This crate will
never use the Rust standard library.
Dual-licensed under MIT or the UNLICENSE.
Add this to your Cargo.toml
:
[dependencies]
csv-core = "0.1.6"
This crate by default links with libc
, which is done via the libc
feature.
Disabling this feature will drop csv-core
's dependency on libc
.
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);
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"[..]);