AzLearn

تمرين إعادة البناء

CSV Sales Summary

أعد كتابة ملخص مبيعات يقرأ CSV بسيطاً ويجمع الإيرادات حسب المنتج.

rust ~15 دقيقة مبتدئ
أعد بناء الكود Rebuild

هذا هو الكود. اكتبه بنفسك.

الكود المرجعي
use std::collections::BTreeMap;
use std::env;
use std::fs;
use std::io;

fn main() -> io::Result<()> {
    let path = env::args()
        .nth(1)
        .unwrap_or_else(|| "sales.csv".to_string());
    let csv = fs::read_to_string(path).unwrap_or_else(|_| sample_sales());
    let mut totals: BTreeMap<String, i64> = BTreeMap::new();

    for line in csv.lines().skip(1) {
        let fields: Vec<_> = line.split(',').map(str::trim).collect();
        if fields.len() != 4 {
            continue;
        }

        let product = fields[1].to_string();
        let quantity = fields[2].parse::<i64>().unwrap_or(0);
        let unit_halalas = fields[3].parse::<i64>().unwrap_or(0);
        *totals.entry(product).or_insert(0) += quantity * unit_halalas;
    }

    for (product, total_halalas) in totals {
        println!("{product}: {}", format_money(total_halalas));
    }

    Ok(())
}

fn sample_sales() -> String {
    "date,product,quantity,unit_halalas\n2026-01-02,Dates,3,2500\n2026-01-02,Coffee,2,1800\n2026-01-03,Dates,1,2500\n".to_string()
}

fn format_money(halalas: i64) -> String {
    format!("{}.{:02} SAR", halalas / 100, halalas.abs() % 100)
}
اكتب هنا