✍️ حالا هر ردیف خام باید از چهار شرط عبور کند: تعداد سلول درست، تاریخ واقعی با شکل دقیق ISO، محصول غیرخالی پس از strip، و عددهایی با دامنه مجاز. فقط ردیف کامل وارد خروجی نرمالشده میشود. یک ردیف خراب هرچند چند ایراد داشته باشد، یک بار در invalid_rows حساب میشود.
مثلاً تاریخ ناممکن 2026-02-30 رد میشود، حتی اگر تعداد و قیمت درست باشند. محصول « دفتر » به «دفتر» تبدیل میشود، ولی تاریخ فاصلهدار را پاکسازی نمیکنیم؛ قرارداد تاریخ دقیق میخواهد. قیمت صفر معتبر است و تعداد صفر معتبر نیست. مقدارهایی که int قبول میکند، مثل عدد با فاصله دو سر، قابل تبدیلاند؛ اعشار رد میشود.
تابع کمکی normalize_row در کد اولیه حاضر است؛ بخش پیمایش CSV و تفکیک ردیف خوب و بد را کامل کن. خط واقعاً خالی یا فقطفاصله، ردیف فروش نیست و نادیده گرفته میشود. اما ,,, چهار سلول خالی دارد و یک ردیف نامعتبر است. خطای رایج، حذف این دو حالت با یک شرط یکسان است. این تفاوت را نگه دار تا شمارنده کیفیت داده، معنی مشخصی داشته باشد.
فعالیت شما
تابع validated_sales(text) فایل موقت CSV با header دقیق date,product,quantity,unit_price میسازد. خروجی {'rows':[رکوردهای معتبر نرمالشده به ترتیب],'invalid_rows':تعداد ردیف ردشده} باشد. تاریخ دقیق واقعی YYYY-MM-DD بدون strip، product با strip غیرخالی، quantity=int(text)>0، unit_price=int(text)>=0؛ سلول کم/اضافه نامعتبر است. خط بدون سلول یا تنها یک سلول فقطفاصله نادیده گرفته شود؛ ',,,' نامعتبر است. خالی/فقط header خروجی rows=[] و invalid_rows=0. هر ردیف خراب فقط یک بار شمرده شود و تکرار معتبر حفظ شود؛ 2026-01-01, دفتر ,2,0 یک رکورد دفتر با دو عدد 2 و0 است.