تخطَّ إلى المحتوى

مشروع: تلخيص ملف CSV

الفكرة: مبيعات <ملف.csv> يجمع لكل منطقة عدد الأسطر والكمية والإيراد، ويجد أفضل شهر. والأسطر الفاسدة تُعدّ ولا توقف البرنامج.

في الملف سطران فاسدان عمداً: سطر ناقص الحقول (9)، وسطر كميته كلمة لا عدد (10).

مبيعات.csv
التاريخ,المنطقة,المنتج,الكمية,السعر
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 مبيعات.م -- مبيعات.csv · meem 0.10.0+b01b55f
المنطقة        الأسطر    الكمية        الإيرادالرياض	       4        21  141.75تونس	       2        21  90.00القاهرة	       2        12  49.00الإجمالي: 280.75  أسطر فاسدة: 2 (سطر 9: حقول_ناقصة)أفضل شهر: 3 بإيراد 140.00

بُني أيضاً بـ meem build عند بناء الموقع: ملف ساكن حجمه 84.0 ك.ب، شُغّل وحده وطابق مخرجه المخرج أعلاه.

  1. تحليل السطر: حلل ترجع !سجل. تقسم السطر بـ تقسيم(سطر, ",")، وترجع خطأها حقول_ناقصة إن لم تكن الحقول خمسة. وتحويل الأرقام بـ جرّب عدد(...) يمرّر صيغة_خاطئة إن لم يكن الحقل عدداً.
  2. السطر الفاسد لا يوقف البرنامج: حلل(سطر) والا خ: تعدّ الفاسد، وتحفظ وصف أوله، ثم تجاوز إلى السطر التالي.
  3. التجميع: قاموس مناطق يحفظ موضع كل منطقة في القائمة جدول، ومصفوفة ثابتة اشهر من 13 خانة تجمع الإيراد لكل شهر.
  4. الترتيب والطباعة: رتب_ب بالإيراد، ورياضيات.نسق بخانتين.
  • تعديل عنصر في قائمة: كتب صاحب التقرير ق = جدول[م] ثم جدول[م] = ق، ظناً أن تعديل حقل في عنصر قائمة غير ممكن. ثم وجد أن جدول[م].كمية += س.كمية يعمل مباشرة. النقص كان في الوثائق لا في اللغة.
  • تحذير --strict: النص اول_فاسد يُبنى بـ دمج_نصوص داخل الحلقة ولا يُحرَّر، فينبّه المجمّع مع --strict (التحذير E0270). هنا يُبنى مرة واحدة في الواقع (عند أول سطر فاسد)، فالتحذير احتياط لا خلل؛ لذلك يُعرض هذا المثال بلا الحارس الصارم.
  • الذاكرة والزمن: على 200 ألف سطر: 0.64 ث مبنياً ساكناً (0.48 حركياً) و76.1 م.ب، مقابل 0.54 ث و10.9 م.ب لبايثون.
  • والا خ: مع تجاوز يجعل «سطر فاسد» حالة عادية تُعدّ، لا استثناء يوقف كل شيء.
  • مصفوفة ثابتة (مصفوفة[كسر, 13]) تناسب عدداً معروفاً من الخانات، ولا تحجز من الكومة.