|  | csv-core | 
|  | ======== | 
|  | A fast CSV reader and write for use in a `no_std` context. This crate will | 
|  | never use the Rust standard library. | 
|  |  | 
|  | [](https://travis-ci.org/BurntSushi/rust-csv) | 
|  | [](https://ci.appveyor.com/project/BurntSushi/rust-csv) | 
|  | [](https://crates.io/crates/csv-core) | 
|  |  | 
|  | Dual-licensed under MIT or the [UNLICENSE](http://unlicense.org). | 
|  |  | 
|  | ### Documentation | 
|  |  | 
|  | https://docs.rs/csv-core | 
|  |  | 
|  | ### Usage | 
|  |  | 
|  | Add this to your `Cargo.toml`: | 
|  |  | 
|  | ```toml | 
|  | [dependencies] | 
|  | csv-core = "0.1.6" | 
|  | ``` | 
|  |  | 
|  | ### Build features | 
|  |  | 
|  | 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`. | 
|  |  | 
|  |  | 
|  | ### Example: reading CSV | 
|  |  | 
|  | This example shows how to count the number of fields and records in CSV data. | 
|  |  | 
|  | ```rust | 
|  | 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. | 
|  |  | 
|  | ```rust | 
|  | 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"[..]); | 
|  | ``` |