tag | 9cc966b767f00734276ad58516f8648896f3fc03 | |
---|---|---|
tagger | The Android Open Source Project <initial-contribution@android.com> | Wed May 08 00:18:05 2024 -0700 |
object | eb1ac59a66ecb514a99aa41c9f7e574ea1e75517 |
Android CTS 14.0 Release 4 (11801623)
commit | eb1ac59a66ecb514a99aa41c9f7e574ea1e75517 | [log] [tgz] |
---|---|---|
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | Fri Mar 10 02:19:43 2023 +0000 |
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | Fri Mar 10 02:19:43 2023 +0000 |
tree | bf4fdb5e3adec2af8619a29f06af5691fc9b182d | |
parent | b6ecca9754d3aa9e4cca3fce91a8b4bf84f85c6d [diff] | |
parent | cafded5f2cd265a56199464282ee967271b60b4e [diff] |
Snap for 9719949 from cafded5f2cd265a56199464282ee967271b60b4e to udc-release Change-Id: I0571688e3ad86f9232199a38de7409ef59641106
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"[..]);