From ca13c3b10c1dc79747eafc52b93ad0d1a11b9c80 Mon Sep 17 00:00:00 2001 From: Alisha Date: Tue, 11 Jul 2017 11:34:10 +0530 Subject: [PATCH] Handle invalid CSV data with serde --- src/encoding.md | 57 +++++++++++++++++++++++++++++++++++++++++++++++++ src/intro.md | 2 ++ 2 files changed, 59 insertions(+) diff --git a/src/encoding.md b/src/encoding.md index 1408231..635b677 100644 --- a/src/encoding.md +++ b/src/encoding.md @@ -10,6 +10,7 @@ | [Encode and decode base64][ex-base64] | [![base64-badge]][base64] | [![cat-encoding-badge]][cat-encoding] | | [Serialize records to CSV][ex-serialize-csv] | [![csv-badge]][csv] | [![cat-encoding-badge]][cat-encoding] | | [Serialize records to CSV using Serde][ex-csv-serde] | [![csv-badge]][csv] [![serde-badge]][serde] | [![cat-encoding-badge]][cat-encoding] | +| [Handle invalid CSV data with Serde][ex-invalid-csv] | [![csv-badge]][csv] [![serde-badge]][serde] | [![cat-encoding-badge]][cat-encoding] | [ex-json-value]: #ex-json-value @@ -433,6 +434,58 @@ fn run() -> Result<()> { wtr.serialize(rec3)?; wtr.flush()?; + + Ok(()) +} +# +# quick_main!(run); +``` + +[ex-invalid-csv]: #ex-invalid-csv + +## Handle invalid CSV data with Serde + +[![csv-badge]][csv] [![serde-badge]][serde] [![cat-encoding-badge]][cat-encoding] + +CSV files often contain invalid data. For these cases, the csv crate +provides a custom deserializer, [`csv::invalid_option`], which automatically +converts invalid data to None values. + +```rust +# #[macro_use] +# extern crate error_chain; +extern crate csv; +extern crate serde; +#[macro_use] +extern crate serde_derive; + +#[derive(Debug, Deserialize)] +struct Record { + name: String, + place: String, + #[serde(deserialize_with = "csv::invalid_option")] + id: Option, +} +# +# error_chain! { +# foreign_links { +# CsvError(csv::Error); +# } +# } + +fn run() -> Result<()> { + let data = "name,place,id + mark,sydney,46.5 + ashley,zurich,92 + akshat,delhi,37 + alisha,colombo,xyz"; + + let mut rdr = csv::Reader::from_reader(data.as_bytes()); + for result in rdr.deserialize() { + let record: Record = result?; + println!("{:?}", record); + } + Ok(()) } # @@ -469,7 +522,11 @@ fn run() -> Result<()> { [application/x-www-form-urlencoded]: https://url.spec.whatwg.org/#application/x-www-form-urlencoded [`form_urlencoded::byte_serialize`]: https://docs.rs/url/1.4.0/url/form_urlencoded/fn.byte_serialize.html [`form_urlencoded::parse`]: https://docs.rs/url/*/url/form_urlencoded/fn.parse.html +<<<<<<< HEAD [`csv::Writer`]: https://docs.rs/csv/*/csv/struct.Writer.html [`write_record`]: https://docs.rs/csv/*/csv/struct.Writer.html#method.write_record [`serialize`]: https://docs.rs/csv/*/csv/struct.Writer.html#method.serialize [`flush`]: https://docs.rs/csv/*/csv/struct.Writer.html#method.flush +======= +[`csv::invalid_option`]: https://docs.rs/csv/*/csv/fn.invalid_option.html +>>>>>>> Handle invalid CSV data with serde diff --git a/src/intro.md b/src/intro.md index 595ce01..e55a75f 100644 --- a/src/intro.md +++ b/src/intro.md @@ -45,6 +45,7 @@ community. It needs and welcomes help. For details see | [Encode and decode base64][ex-base64] | [![base64-badge]][base64] | [![cat-encoding-badge]][cat-encoding] | | [Serialize records to CSV][ex-serialize-csv] | [![csv-badge]][csv] | [![cat-encoding-badge]][cat-encoding] | | [Serialize records to CSV using Serde][ex-csv-serde] | [![csv-badge]][csv] [![serde-badge]][serde] | [![cat-encoding-badge]][cat-encoding] | +| [Handle invalid CSV data with Serde][ex-invalid-csv] | [![csv-badge]][csv] [![serde-badge]][serde] | [![cat-encoding-badge]][cat-encoding] | ## [Concurrency](concurrency.html) @@ -250,6 +251,7 @@ Keep lines sorted. [ex-log-syslog]: logging.html#ex-log-syslog [ex-log-timestamp]: logging.html#ex-log-timestamp [ex-log-stdout]: logging.html#ex-log-stdout +[ex-invalid-csv]: encoding.html#ex-invalid-csv [ex-paginated-api]: net.html#ex-paginated-api [ex-parse-subprocess-output]: basics.html#ex-parse-subprocess-output [ex-percent-encode]: encoding.html#ex-percent-encode