مقدمة: لماذا يصبح تقسيم السلسلة النصية البسيط كابوسًا؟
\nقد يبدو الأمر بسيطًا، أليس تقسيم النص إلى أسطر أمرًا سهلاً؟ أي مبتدئ في لغة C# سيقول: «استخدم string.Split('\\n') وستكون المهمة منتهية!». لكن في الواقع، هذه المهمة التي تبدو تافهة للوهلة الأولى تصبح مصدرًا لمئات الأخطاء التي نراها على Stack Overflow. آلاف المطورين يسألون يوميًا نفس السؤال: «تقسيم سلسلة نصية على أسطر جديدة في .NET — لماذا لا يعمل الكود الخاص بي؟».
في هذه المقالة، لن نقدم لك وصفة جاهزة فقط. بل سنمر على الأخطاء التي وقع فيها حتى المبرمجون ذوو الخبرة. ستتعلم كيفية تقسيم السلاسل النصية بشكل صحيح مع مراعاة المنصات المختلفة، والترميزات، وتنسيقات الملفات غير المتوقعة. استعد — سيكون الأمر مؤلمًا ومفيدًا.
\n\nأفضل 5 أخطاء عند تقسيم سلسلة نصية إلى أسطر في C#
\n\n1. الاستخدام الساذج لـ '\\n' — قاتل التوافق عبر المنصات
\nالخطأ الأكثر شيوعًا هو ترميز حرف السطر الجديد بشكل ثابت. يكتب الكثيرون:
\nstring text = "السطر الأول\\nالسطر الثاني\\nالسطر الثالث";\nstring[] lines = text.Split('\\n');\nالمشكلة: في Windows، الفاصل القياسي هو "\\r\\n" (إرجاع العربة + تغذية السطر)، بينما في Linux/macOS هو ببساطة '\\n'. إذا حصلت على نص من ملف تم إنشاؤه في Windows، فسيترك الكود الخاص بك الحرف '\\r' في نهاية كل سطر. النتيجة: "السطر الأول\\r" — وسيصاب المحلل الخاص بك بالجنون.
الحل: استخدم StringSplitOptions.RemoveEmptyEntries وقم بالتقسيم بناءً على جميع الاحتمالات الممكنة:
string[] lines = text.Split(new[] { "\\r\\n", "\\r", "\\n" }, \n StringSplitOptions.RemoveEmptyEntries);\nهذا الكود سيعالج بشكل صحيح أي مجموعة من أحرف تغذية السطر.
\n\n2. تجاهل Environment.NewLine في وقت التشغيل
\nإذا كنت تكتب كودًا سيعمل على كل من Windows وLinux (على سبيل المثال، تطبيق ASP.NET Core)، فلا يمكنك الاعتماد على الثوابت. Environment.NewLine يُرجع الفاصل الصحيح لنظام التشغيل الحالي، لكنه لا يضمن أن البيانات المدخلة تتوافق مع نظام التشغيل هذا.
المصيدة: تكتب:
\nstring[] lines = text.Split(Environment.NewLine);\nهذا سيعمل فقط إذا تم إنشاء النص على نفس المنصة. إذا قمت بتحميل ملف من الإنترنت (حيث قد تكون الأسطر بنمط Unix) — مرحبًا، خطأ!
\nأفضل ممارسة: استخدم دائمًا الطريقة العامة من النقطة 1، بغض النظر عن المنصة.
\n\n3. نسيان StringSplitOptions.RemoveEmptyEntries
\nانظر إلى هذا الكود:
\nstring text = "السطر1\\n\\nالسطر3";\nstring[] lines = text.Split('\\n');\n// النتيجة: ["السطر1", "", "السطر3"]\nيظهر السطر الفارغ بين "السطر1" و"السطر3" بسبب وجود حرفين متتاليين للسطر الجديد. إذا كنت تعالج ملفات CSV أو سجلات أو ملفات تكوين، فقد تؤدي الأسطر الفارغة إلى تعطيل المنطق.
\nالحل:
\nstring[] lines = text.Split(new[] { "\\r\\n", "\\r", "\\n" }, \n StringSplitOptions.RemoveEmptyEntries);\n// النتيجة: ["السطر1", "السطر3"]\nلكن كن حذرًا: إذا كانت الأسطر الفارغة مهمة (على سبيل المثال، في النص المنسق)، فاستخدم StringSplitOptions.None.
4. مشكلة الحرف الأخير للسطر الجديد
\nتخيل أن لديك ملفًا نصيًا:
\nالسطر1\\nالسطر2\\n\nيتوقع الكثيرون أنه بعد التقسيم سيتم الحصول على مصفوفة من عنصرين. لكن:
\nstring[] lines = text.Split(new[] { '\\n' }, StringSplitOptions.RemoveEmptyEntries);\n// النتيجة: ["السطر1", "السطر2"]\nهذا صحيح. وماذا لو أزلت RemoveEmptyEntries؟
string[] lines = text.Split('\\n');\n// النتيجة: ["السطر