summaryrefslogtreecommitdiff
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
parent622e873e20df7f069716cbc30c2b683f70a67434 (diff)
csv parser example
-rw-r--r--xmd/Cargo.toml11
-rw-r--r--xmd/numbers.csv5
-rw-r--r--xmd/src/csv.pest3
-rw-r--r--xmd/src/lib.rs8
-rw-r--r--xmd/src/main.rs34
5 files changed, 61 insertions, 0 deletions
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 <kj@orbekk.com>"]
+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::<f64>().unwrap();
+ }
+ }
+ Rule::EOI => (),
+ _ => unreachable!(),
+ }
+ }
+
+ println!("Sum of fields: {}", sum);
+ println!("Number of records: {}", records);
+}