✍️ حالا مسیر کامل داده را میسازیم: متن CSV از آرگومان میآید، در فایل نمونه نوشته میشود، ردیفها خوانده و اعتبارسنجی میشوند، سپس جمع کل و گروههای محصول و روز ساخته میشوند. گزارش را با JSON خوانای فارسی ذخیره میکنیم و نتیجه را از همان فایل دوباره میخوانیم. هیچ فایل از درس یا اجرای قبلی در دسترس فرض نمیشود.
مثلاً دو فروش دفتر با تعداد دو و قیمت ده و تعداد یک و قیمت بیست، درآمد چهل و تعداد سه میدهند. یک ردیف با تعداد صفر کنار گذاشته و یک invalid_rows اضافه میشود؛ خط کاملاً خالی نه فروش است و نه خطا. در تکرار یک ردیف معتبر، هر دو فروش شمرده میشوند، چون تکرار ظاهری دلیل حذف معامله نیست.
تابع را مستقل بنویس؛ میتوانی چند تابع کمکی داخل همین پاسخ تعریف کنی. تاریخ دقیق ISO، محصول stripشده، عدد صحیح مثبت برای تعداد و عدد صحیح نامنفی برای قیمت را رعایت کن. خطای رایج، محاسبه بخشی از گزارش قبل از تمام شدن اعتبارسنجی یا برگرداندن دیکشنری پیش از ذخیره و بازخوانی است. برای خواندن راحتتر فایل میتوانی از sort_keys=True و ensure_ascii=False استفاده کنی؛ معیار این تمرین ساختار داده بازخوانیشده است. این پروژه به pandas، کلاس یا شبکه نیاز ندارد؛ همان ابزارهای استاندارد این دوره کافیاند.
فعالیت شما
تابع build_sales_report(text) بنویس. text متن CSV با قالب نقلقول معتبر و header دقیق date,product,quantity,unit_price به همین ترتیب است؛ متن کاملاً خالی هم مجاز. داخل هر فراخوانی فایل sales.csv موقت UTF-8 بساز و با csv بخوان. هر ردیف باید دقیقاً4سلول، date روز واقعی با شکل دقیق YYYY-MM-DD بدون strip، product پس از strip غیرخالی، quantity قابل تبدیل با int و >0 و unit_price قابل تبدیل با int و >=0 داشته باشد؛ اعشار/کلمه، سلول کم/اضافه، تاریخ نامعتبر و نام خالی رد شوند. خط بدون سلول یا تکسلول فقطفاصله را نادیده بگیر؛ ',,,' یک ردیف نامعتبر است. هر ردیف ردشده دقیقاً یک invalid_rows اضافه کند؛ همه ردیفهای معتبر حتی تکراری مستقلاند. خروجی دقیقاً {'total_revenue':جمع quantity*unit_price,'total_quantity':جمع quantity,'by_product':{محصول:{'total_quantity':جمع,'total_revenue':جمع}},'by_day':{روز:{'total_quantity':جمع,'total_revenue':جمع}},'invalid_rows':تعداد} است؛ گروههای با درآمد صفر هم بمانند. خالی/فقط header/فقط خط خالی گزارشی با جمعهای0 و گروههای{} میدهد. گزارش را در report.json همان پوشه با json.dump و UTF-8 بنویس و مقدار json.load همان فایل را برگردان. نمونه دو دفتر با (2,10) و (1,20) درآمد40 و تعداد3 میدهد. هیچ فایل کاربر، زمان فعلی یا اجرای قبل لازم نیست.