114 lines
3.0 KiB
Markdown
114 lines
3.0 KiB
Markdown
|
|
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"[..]);
|
||
|
|
```
|