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/src/csv.pest | 3 +++ xmd/src/lib.rs | 8 ++++++++ xmd/src/main.rs | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+) create mode 100644 xmd/src/csv.pest create mode 100644 xmd/src/lib.rs create mode 100644 xmd/src/main.rs (limited to 'xmd/src') 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