تقسيم السلسلة النصية إلى أسطر في .NET: 5 أخطاء قاتلة وحلولها

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا يصبح تقسيم السلسلة النصية البسيط كابوسًا؟

\n

قد يبدو الأمر بسيطًا، أليس تقسيم النص إلى أسطر أمرًا سهلاً؟ أي مبتدئ في لغة C# سيقول: «استخدم string.Split('\\n') وستكون المهمة منتهية!». لكن في الواقع، هذه المهمة التي تبدو تافهة للوهلة الأولى تصبح مصدرًا لمئات الأخطاء التي نراها على Stack Overflow. آلاف المطورين يسألون يوميًا نفس السؤال: «تقسيم سلسلة نصية على أسطر جديدة في .NET — لماذا لا يعمل الكود الخاص بي؟».

\n

في هذه المقالة، لن نقدم لك وصفة جاهزة فقط. بل سنمر على الأخطاء التي وقع فيها حتى المبرمجون ذوو الخبرة. ستتعلم كيفية تقسيم السلاسل النصية بشكل صحيح مع مراعاة المنصات المختلفة، والترميزات، وتنسيقات الملفات غير المتوقعة. استعد — سيكون الأمر مؤلمًا ومفيدًا.

\n\n

أفضل 5 أخطاء عند تقسيم سلسلة نصية إلى أسطر في C#

\n\n

1. الاستخدام الساذج لـ '\\n' — قاتل التوافق عبر المنصات

\n

الخطأ الأكثر شيوعًا هو ترميز حرف السطر الجديد بشكل ثابت. يكتب الكثيرون:

\n
string text = "السطر الأول\\nالسطر الثاني\\nالسطر الثالث";\nstring[] lines = text.Split('\\n');
\n

المشكلة: في Windows، الفاصل القياسي هو "\\r\\n" (إرجاع العربة + تغذية السطر)، بينما في Linux/macOS هو ببساطة '\\n'. إذا حصلت على نص من ملف تم إنشاؤه في Windows، فسيترك الكود الخاص بك الحرف '\\r' في نهاية كل سطر. النتيجة: "السطر الأول\\r" — وسيصاب المحلل الخاص بك بالجنون.

\n

الحل: استخدم StringSplitOptions.RemoveEmptyEntries وقم بالتقسيم بناءً على جميع الاحتمالات الممكنة:

\n
string[] lines = text.Split(new[] { "\\r\\n", "\\r", "\\n" }, \n    StringSplitOptions.RemoveEmptyEntries);
\n

هذا الكود سيعالج بشكل صحيح أي مجموعة من أحرف تغذية السطر.

\n\n

2. تجاهل Environment.NewLine في وقت التشغيل

\n

إذا كنت تكتب كودًا سيعمل على كل من Windows وLinux (على سبيل المثال، تطبيق ASP.NET Core)، فلا يمكنك الاعتماد على الثوابت. Environment.NewLine يُرجع الفاصل الصحيح لنظام التشغيل الحالي، لكنه لا يضمن أن البيانات المدخلة تتوافق مع نظام التشغيل هذا.

\n

المصيدة: تكتب:

\n
string[] lines = text.Split(Environment.NewLine);
\n

هذا سيعمل فقط إذا تم إنشاء النص على نفس المنصة. إذا قمت بتحميل ملف من الإنترنت (حيث قد تكون الأسطر بنمط Unix) — مرحبًا، خطأ!

\n

أفضل ممارسة: استخدم دائمًا الطريقة العامة من النقطة 1، بغض النظر عن المنصة.

\n\n

3. نسيان StringSplitOptions.RemoveEmptyEntries

\n

انظر إلى هذا الكود:

\n
string text = "السطر1\\n\\nالسطر3";\nstring[] lines = text.Split('\\n');\n// النتيجة: ["السطر1", "", "السطر3"]
\n

يظهر السطر الفارغ بين "السطر1" و"السطر3" بسبب وجود حرفين متتاليين للسطر الجديد. إذا كنت تعالج ملفات CSV أو سجلات أو ملفات تكوين، فقد تؤدي الأسطر الفارغة إلى تعطيل المنطق.

\n

الحل:

\n
string[] lines = text.Split(new[] { "\\r\\n", "\\r", "\\n" }, \n    StringSplitOptions.RemoveEmptyEntries);\n// النتيجة: ["السطر1", "السطر3"]
\n

لكن كن حذرًا: إذا كانت الأسطر الفارغة مهمة (على سبيل المثال، في النص المنسق)، فاستخدم StringSplitOptions.None.

\n\n

4. مشكلة الحرف الأخير للسطر الجديد

\n

تخيل أن لديك ملفًا نصيًا:

\n
السطر1\\nالسطر2\\n
\n

يتوقع الكثيرون أنه بعد التقسيم سيتم الحصول على مصفوفة من عنصرين. لكن:

\n
string[] lines = text.Split(new[] { '\\n' }, StringSplitOptions.RemoveEmptyEntries);\n// النتيجة: ["السطر1", "السطر2"]
\n

هذا صحيح. وماذا لو أزلت RemoveEmptyEntries؟

\n
string[] lines = text.Split('\\n');\n// النتيجة: ["السطر                

المدونات

توصيات الكتب