analyst 0.1.0

A command line tool that supports quick browsing of csv data.
Documentation
use crate::reader::StreamingCsvReader;
use anyhow::Result;
use std::collections::HashMap;

pub fn analyze(mut reader: StreamingCsvReader, target_column: Option<&str>) -> Result<()> {
    let headers = reader.headers().clone();
    let mut missing_counts: HashMap<String, usize> = headers
        .iter()
        .map(|header| (header.to_string(), 0))
        .collect();

    let mut total_rows = 0;

    while let Some(result) = reader.next() {
        let record = result?;
        total_rows += 1;
        for (i, field) in record.iter().enumerate() {
            if field.is_empty() {
                *missing_counts.get_mut(&headers[i].to_string()).unwrap() += 1;
            }
        }
    }

    println!("Total rows analyzed: {}", total_rows);
    println!("Missing value analysis:");

    for (header, count) in missing_counts.iter() {
        if target_column.is_none() || target_column.unwrap() == header {
            let percentage = (*count as f64 / total_rows as f64) * 100.0;
            println!("{}: {} missing values ({:.2}%)", header, count, percentage);
        }
    }

    Ok(())
}