مشروع: تلخيص ملف CSV
الفكرة: مبيعات <ملف.csv> يجمع لكل منطقة عدد الأسطر والكمية والإيراد، ويجد أفضل شهر. والأسطر الفاسدة تُعدّ ولا توقف البرنامج.
البيانات
رابط إلى قسم «البيانات»في الملف سطران فاسدان عمداً: سطر ناقص الحقول (9)، وسطر كميته كلمة لا عدد (10).
التاريخ,المنطقة,المنتج,الكمية,السعر 2026-01-05,الرياض,قلم,10,2.5 2026-01-07,القاهرة,دفتر,4,7.25 2026-02-11,الرياض,دفتر,3,7.25 2026-02-14,تونس,قلم,20,2.5 2026-03-02,القاهرة,قلم,8,2.5 2026-03-09,تونس,حقيبة,1,40.0 2026-03-12,الرياض,حقيبة,2,40.0 2026-03-15,القاهرة,ممحاة 2026-04-01,تونس,قلم,خمسة,2.5 2026-04-03,الرياض,قلم,6,2.5
البرنامج
رابط إلى قسم «البرنامج»# معالجة ملف CSV: إجمالي المبيعات لكل منطقة ولكل شهر، مع عدّ الأسطر الفاسدةاستورد نظاماستورد ملفاتاستورد رياضيات
هيكل اجمالي: منطقة نص كمية عدد ايراد كسر اسطر عدد
هيكل سجل: شهر عدد منطقة نص كمية عدد سعر كسر
اخطاء: حقول_ناقصة
داله حلل(سطر نص) !سجل: ح = تقسيم(سطر, ",") خاتمه حرر(ح) اذا طول(ح) != 5: ارجع خطأ.حقول_ناقصة تاريخ = تقسيم(ح[0], "-") خاتمه حرر(تاريخ) اذا طول(تاريخ) != 3: ارجع خطأ.صيغة_خاطئة شهر = جرّب عدد(تاريخ[1]) كمية = جرّب عدد(ح[3]) سعر = جرّب كسر(ح[4]) ارجع سجل(شهر, ح[1], كمية, سعر)
داله قبل(ا اجمالي, ب اجمالي) منطقي: ارجع ا.ايراد > ب.ايراد
داله رئيسي() !فراغ: و = نظام.وسائط() اذا طول(و) != 1: اطبع("الاستعمال: مبيعات <ملف.csv>") نظام.انهِ(2) سطور = جرّب ملفات.اقرأ_سطور(و[0]) خاتمه حرر(سطور) مناطق قاموس[نص, عدد] = {} # المنطقة ← موضعها في القائمة خاتمه حرر(مناطق) جدول قائمة[اجمالي] = [] خاتمه حرر(جدول) اشهر مصفوفة[كسر, 13] = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] فاسدة = 0 اول_فاسد = "" لكل ع في مدى(1, طول(سطور)): اذا طول(سطور[ع]) == 0: تجاوز س = حلل(سطور[ع]) والا خ: فاسدة += 1 اذا فاسدة == 1: اول_فاسد = دمج_نصوص("سطر ", ع + 1, ": ", خ) تجاوز اذا !يوجد(مناطق, س.منطقة): مناطق[س.منطقة] = طول(جدول) اضف(جدول, اجمالي(س.منطقة, 0, 0.0, 0)) م = مناطق[س.منطقة] ق = جدول[م] ق.كمية += س.كمية ق.ايراد += كسر(س.كمية) * س.سعر ق.اسطر += 1 جدول[م] = ق اشهر[س.شهر] += كسر(س.كمية) * س.سعر رتب_ب(جدول, قبل) اطبع("المنطقة الأسطر الكمية الإيراد") كلي = 0.0 لكل ق في جدول: اطبع(ق.منطقة, "\t", رياضيات.نسق_عدد(ق.اسطر, 8, خطاء), رياضيات.نسق_عدد(ق.كمية, 10, خطاء), " ", رياضيات.نسق(ق.ايراد, 2)) كلي += ق.ايراد اطبع("الإجمالي: ", رياضيات.نسق(كلي, 2), " أسطر فاسدة: ", فاسدة, " (", اول_فاسد, ")") افضل = 1 لكل ش في مدى(2, 13): اذا اشهر[ش] > اشهر[افضل]: افضل = ش اطبع("أفضل شهر: ", افضل, " بإيراد ", رياضيات.نسق(اشهر[افضل], 2))
جرّب رئيسي()بُني أيضاً بـ meem build عند بناء الموقع: ملف ساكن حجمه 84.0 ك.ب، شُغّل وحده وطابق مخرجه المخرج أعلاه.
خطوة خطوة
رابط إلى قسم «خطوة خطوة»- تحليل السطر:
حللترجع!سجل. تقسم السطر بـتقسيم(سطر, ",")، وترجع خطأهاحقول_ناقصةإن لم تكن الحقول خمسة. وتحويل الأرقام بـجرّب عدد(...)يمرّرصيغة_خاطئةإن لم يكن الحقل عدداً. - السطر الفاسد لا يوقف البرنامج:
حلل(سطر) والا خ:تعدّ الفاسد، وتحفظ وصف أوله، ثمتجاوزإلى السطر التالي. - التجميع: قاموس
مناطقيحفظ موضع كل منطقة في القائمةجدول، ومصفوفة ثابتةاشهرمن 13 خانة تجمع الإيراد لكل شهر. - الترتيب والطباعة:
رتب_ببالإيراد، ورياضيات.نسقبخانتين.
ما كان صعباً
رابط إلى قسم «ما كان صعباً»- تعديل عنصر في قائمة: كتب صاحب التقرير
ق = جدول[م]ثمجدول[م] = ق، ظناً أن تعديل حقل في عنصر قائمة غير ممكن. ثم وجد أنجدول[م].كمية += س.كميةيعمل مباشرة. النقص كان في الوثائق لا في اللغة. - تحذير
--strict: النصاول_فاسديُبنى بـدمج_نصوصداخل الحلقة ولا يُحرَّر، فينبّه المجمّع مع--strict(التحذير E0270). هنا يُبنى مرة واحدة في الواقع (عند أول سطر فاسد)، فالتحذير احتياط لا خلل؛ لذلك يُعرض هذا المثال بلا الحارس الصارم. - الذاكرة والزمن: على 200 ألف سطر: 0.64 ث مبنياً ساكناً (0.48 حركياً) و76.1 م.ب، مقابل 0.54 ث و10.9 م.ب لبايثون.
ما تعلّمناه
رابط إلى قسم «ما تعلّمناه»والا خ:معتجاوزيجعل «سطر فاسد» حالة عادية تُعدّ، لا استثناء يوقف كل شيء.- مصفوفة ثابتة (
مصفوفة[كسر, 13]) تناسب عدداً معروفاً من الخانات، ولا تحجز من الكومة.