Able to parse CSV

AfoHT
Jul 9, 2021, 9:29 AM
QDZOD3MNMZUH4NDQLFTR537OCTJ2ATTHV4MJGBAQGJRW342PYSTQC

Dependencies

Change contents

  • file addition: src (d--r------)
    [1.0]
  • file addition: main.rs (----------)
    [0.15]
    use std::error::Error;
    use std::io;
    use std::process;
    //use chrono::prelude::*;
    use serde::Deserialize;
    // By default, struct field names are deserialized based on the position of
    // a corresponding field in the CSV data's header record.
    #[derive(Debug, Deserialize)]
    #[serde(rename_all = "PascalCase")]
    struct IcaTransaction {
    datum: String,
    text: String,
    typ: String,
    budgetgrupp: String,
    belopp: String,
    saldo: Option<String>,
    }
    // By default, struct field names are deserialized based on the position of
    // a corresponding field in the CSV data's header record.
    #[derive(Debug, Deserialize)]
    #[serde(rename_all = "PascalCase")]
    struct GCTransaction {
    date: String,
    transaction_id: String,
    number: String,
    description: Option<String>,
    notes: Option<String>,
    commodity_currency: Option<String>,
    void_reason: Option<String>,
    action: Option<String>,
    memo: Option<String>,
    full_account_name: Option<String>,
    account_name: Option<String>,
    amount_with_sym: Option<String>,
    amount_num: Option<String>,
    reconcile: Option<String>,
    reconcile_date: Option<String>,
    rate_price: Option<String>,
    }
    fn example() -> Result<(), Box<dyn Error>> {
    let mut rdr = csv::ReaderBuilder::new()
    .has_headers(true)
    .delimiter(b';')
    .from_path("konto.csv")?;
    let mut wtr = csv::Writer::from_writer(io::stdout());
    //let mut wtr = csv::WriterBuilder::from_writer(&self, wtr)
    // Write headers manually.
    wtr.write_record(&[
    "Date",
    "Transaction ID",
    "Number",
    "Description",
    "Notes",
    "Commodity/Currency",
    "Void Reason",
    "Action",
    "Memo",
    "Full Account Name",
    "Account Name",
    "Amount With Sym.",
    "Amount Num",
    "Reconcile",
    "Reconcile Date",
    "Rate/Price",
    ])?;
    for result in rdr.deserialize() {
    // Notice that we need to provide a type hint for automatic
    // deserialization.
    let record: IcaTransaction = result?;
    println!("{:?}", record);
    }
    Ok(())
    }
    fn main() {
    if let Err(err) = example() {
    println!("error running example: {}", err);
    process::exit(1);
    }
    }