diff options
Diffstat (limited to 'README.md')
-rw-r--r-- | README.md | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/README.md b/README.md new file mode 100644 index 0000000..07afd99 --- /dev/null +++ b/README.md @@ -0,0 +1,113 @@ +csv-core +======== +A fast CSV reader and write for use in a `no_std` context. This crate will +never use the Rust standard library. + +[![Linux build status](https://api.travis-ci.org/BurntSushi/rust-csv.png)](https://travis-ci.org/BurntSushi/rust-csv) +[![Windows build status](https://ci.appveyor.com/api/projects/status/github/BurntSushi/rust-csv?svg=true)](https://ci.appveyor.com/project/BurntSushi/rust-csv) +[![](http://meritbadge.herokuapp.com/csv-core)](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"[..]); +``` |