From cc268ccb4fa2f7573694af189089ca8f788b0597 Mon Sep 17 00:00:00 2001 From: Kjetil Orbekk Date: Wed, 16 Jun 2021 07:20:41 -0400 Subject: csv parser example --- xmd/Cargo.toml | 11 +++++++++++ xmd/numbers.csv | 5 +++++ xmd/src/csv.pest | 3 +++ xmd/src/lib.rs | 8 ++++++++ xmd/src/main.rs | 34 ++++++++++++++++++++++++++++++++++ 5 files changed, 61 insertions(+) create mode 100644 xmd/Cargo.toml create mode 100644 xmd/numbers.csv create mode 100644 xmd/src/csv.pest create mode 100644 xmd/src/lib.rs create mode 100644 xmd/src/main.rs diff --git a/xmd/Cargo.toml b/xmd/Cargo.toml new file mode 100644 index 0000000..fa4ca6a --- /dev/null +++ b/xmd/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "xmd" +version = "0.1.0" +authors = ["Kjetil Orbekk "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +pest = "2.0" +pest_derive = "2.0" diff --git a/xmd/numbers.csv b/xmd/numbers.csv new file mode 100644 index 0000000..20a98c9 --- /dev/null +++ b/xmd/numbers.csv @@ -0,0 +1,5 @@ +65279,1179403647,1463895090 +3.1415927,2.7182817,1.618034 +-40,-273.15 +13,42 +65537 diff --git a/xmd/src/csv.pest b/xmd/src/csv.pest new file mode 100644 index 0000000..bb9af51 --- /dev/null +++ b/xmd/src/csv.pest @@ -0,0 +1,3 @@ +field = { (ASCII_DIGIT | "." | "-")+ } +record = { field ~ ("," ~ field)* } +file = { SOI ~ (record ~ ("\r\n" | "\n"))* ~ EOI } diff --git a/xmd/src/lib.rs b/xmd/src/lib.rs new file mode 100644 index 0000000..8c98a57 --- /dev/null +++ b/xmd/src/lib.rs @@ -0,0 +1,8 @@ +extern crate pest; +#[macro_use] +extern crate pest_derive; + +use pest::Parser; +#[derive(Parser)] +#[grammar = "csv.pest"] +pub struct CSVParser; diff --git a/xmd/src/main.rs b/xmd/src/main.rs new file mode 100644 index 0000000..42406df --- /dev/null +++ b/xmd/src/main.rs @@ -0,0 +1,34 @@ +use pest::Parser; +use std::fs; + +use xmd::CSVParser; +use xmd::Rule; + +fn main() { + let unparsed_file = fs::read_to_string("numbers.csv").expect("cannot read file"); + + let file = CSVParser::parse(Rule::file, &unparsed_file) + .expect("unsuccessful parse") + .next() + .unwrap(); + + let mut sum: f64 = 0.0; + let mut records: i64 = 0; + + for record in file.into_inner() { + match record.as_rule() { + Rule::record => { + records += 1; + + for field in record.into_inner() { + sum += field.as_str().parse::().unwrap(); + } + } + Rule::EOI => (), + _ => unreachable!(), + } + } + + println!("Sum of fields: {}", sum); + println!("Number of records: {}", records); +} -- cgit v1.2.3