diff --git a/.gitignore b/.gitignore index ea8c4bf..cdbb7bc 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ /target +.~lock.data.xlsx# +data.db \ No newline at end of file diff --git a/.~lock.file.xlsx# b/.~lock.file.xlsx# deleted file mode 100644 index be51d83..0000000 --- a/.~lock.file.xlsx# +++ /dev/null @@ -1 +0,0 @@ -,robviren,Compy550,12.12.2021 20:08,file:///home/robviren/.config/libreoffice/4; \ No newline at end of file diff --git a/data.db b/data.db index b0180ec..13d52bd 100644 Binary files a/data.db and b/data.db differ diff --git a/file.xlsx b/data.xlsx similarity index 60% rename from file.xlsx rename to data.xlsx index 4cf7b2d..0e5f41b 100644 Binary files a/file.xlsx and b/data.xlsx differ diff --git a/src/main.rs b/src/main.rs index f4a534c..2c3321a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,4 @@ -use std::error::Error; +use std::{collections::HashMap, error::Error}; use calamine::{open_workbook, Reader, Xlsx}; use rusqlite::{Connection, Result}; @@ -31,47 +31,73 @@ struct Data { fn main() -> Result<(), Box> { let now = chrono::offset::Local::now(); let mut data_vec = Vec::with_capacity(100000); - let mut excel: Xlsx<_> = open_workbook("file.xlsx").unwrap(); - if let Some(Ok(r)) = excel.worksheet_range("Export") { - for row in r.rows().skip(1) { - if row[34].get_string() == None { - break; + let mut excel: Xlsx<_> = open_workbook("data.xlsx").unwrap(); + let r = excel + .worksheet_range("Export") + .expect("Is There") + .expect("Excel Read Error"); + + let mut indexs = HashMap::new(); + let mut skip_count = 0; + 'outer: for row in r.rows() { + skip_count += 1; + for (i, elm) in row.iter().enumerate() { + let header = elm.get_string().expect("header issue"); + match header { + "FiscalYearMonth" => indexs.insert("date", i), + "Level2" => indexs.insert("level2", i), + "Level3" => indexs.insert("level3", i), + "MaterialEntered" => indexs.insert("sku", i), + "Quantity" => indexs.insert("quantity", i), + "SalesRevenue" => indexs.insert("revenue", i), + "CostOfGoodsSold" => indexs.insert("cost", i), + "ProductDescription" => indexs.insert("description", i), + _ => None, + }; + if indexs.len() == 8 { + break 'outer; } - let datestring = row[28].get_string().expect("Date Parsing Issue"); - let year = datestring[0..4].parse::().unwrap(); - let month = datestring[5..].parse::().unwrap(); - data_vec.push(Data { - description: String::from(row[46].get_string().unwrap().replace("\"", "")), - sku: String::from(row[35].get_string().unwrap()), - level2: String::from(row[31].get_string().unwrap()), - level3: String::from(row[32].get_string().unwrap()), - revenue: match row[76].get_float() { - Some(x) => x, - None => match row[76].get_int() { - Some(x) => x as f64, - None => 0.0, - }, - }, - cost: match row[74].get_float() { - Some(x) => x, - None => match row[74].get_int() { - Some(x) => x as f64, - None => 0.0, - }, - }, - quantity: match row[75].get_int() { - Some(x) => x, - None => match row[75].get_float() { - Some(x) => x as i64, - None => 0, - }, - }, - year: year, - month: month, - }); } } + for row in r.rows().skip(skip_count) { + if row[indexs["sku"]].get_string() == None { + break; + } + let datestring = row[indexs["date"]].get_string().expect("Date Parsing Issue"); + let year = datestring[0..4].parse::().unwrap(); + let month = datestring[5..].parse::().unwrap(); + data_vec.push(Data { + description: String::from(row[indexs["description"]].get_string().unwrap().replace("\"", "")), + sku: String::from(row[indexs["sku"]].get_string().unwrap()), + level2: String::from(row[indexs["level2"]].get_string().unwrap()), + level3: String::from(row[indexs["level3"]].get_string().unwrap()), + revenue: match row[indexs["revenue"]].get_float() { + Some(x) => x, + None => match row[indexs["revenue"]].get_int() { + Some(x) => x as f64, + None => 0.0, + }, + }, + cost: match row[indexs["cost"]].get_float() { + Some(x) => x, + None => match row[indexs["cost"]].get_int() { + Some(x) => x as f64, + None => 0.0, + }, + }, + quantity: match row[indexs["quantity"]].get_int() { + Some(x) => x, + None => match row[indexs["quantity"]].get_float() { + Some(x) => x as i64, + None => 0, + }, + }, + year: year, + month: month, + }); + } + let conn = Connection::open("data.db")?; conn.execute("DROP TABLE IF EXISTS data;", [])?; conn.execute(SCHEMA, [])?;