summaryrefslogtreecommitdiff
path: root/xmd/src
diff options
context:
space:
mode:
authorKjetil Orbekk <kj@orbekk.com>2021-06-16 07:20:41 -0400
committerKjetil Orbekk <kj@orbekk.com>2021-06-16 07:20:41 -0400
commitcc268ccb4fa2f7573694af189089ca8f788b0597 (patch)
tree7ab821d6584e76361db61566786d63bcd9679d25 /xmd/src
parent622e873e20df7f069716cbc30c2b683f70a67434 (diff)
csv parser example
Diffstat (limited to 'xmd/src')
-rw-r--r--xmd/src/csv.pest3
-rw-r--r--xmd/src/lib.rs8
-rw-r--r--xmd/src/main.rs34
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);
+}