diff options
Diffstat (limited to 'xmd/src')
-rw-r--r-- | xmd/src/csv.pest | 3 | ||||
-rw-r--r-- | xmd/src/lib.rs | 8 | ||||
-rw-r--r-- | xmd/src/main.rs | 34 |
3 files changed, 45 insertions, 0 deletions
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::<f64>().unwrap(); + } + } + Rule::EOI => (), + _ => unreachable!(), + } + } + + println!("Sum of fields: {}", sum); + println!("Number of records: {}", records); +} |