برمجة ساستحليل البيانات

ساس: كيفية إزالة الفواصل من السلسلة النصية

دليل أكاديمي تطبيقي شامل يشرح كيفية إزالة الفواصل من السلاسل النصية في نظام SAS باستخدام دالتي TRANSLATE وCOMPRESS مع تحليل الكفاءة والبدائل البرمجية.

Mohammed looti أكاديمي وباحث متخصص في علم النفس
تاريخ النشر
تمت المراجعة العلمية · د. مروة عبد العظيم · 11 سبتمبر، 2026
مراجعة وتدقيق علمي معتمد تاريخ التدقيق: 11 سبتمبر، 2026
د. مروة عبد العظيم دكتوراه
أستاذة علم النفس جامعة كربلاء
معايير التدقيق والاعتماد السريري

يخضع هذا المحتوى لمعايير ضبط الجودة والتدقيق العلمي والأكاديمي الصارمة في شبكة علم النفس العربي، لضمان صحة المعلومات ودقتها السريرية ومطابقتها لأحدث الأدلة والبراهين الصادرة عن الجمعيات النفسية والطبية المعتمدة (APA / WHO).

يحتل تنظيف البيانات النصية مكانة محورية في مسار التحليل الإحصائي وعلوم البيانات؛ إذ تمثل جودة المدخلات الحجر الأساس في ضمان موثوقية النتائج والنماذج التنبؤية المتقدمة. في بيئة البرمجة الإحصائية ساس (SAS System)، تتطلب معالجة النصوص دقة بالغة نظراً لصرامة محرك خطوات البيانات (DATA Step) وآليات إدارة الذاكرة وتخصيص أطوال المتغيرات الحرفية. ومن بين التحديات المتكررة التي تواجه محللي البيانات ومهندسي ذكاء الأعمال، تبرز مشكلة وجود الرموز غير المرغوب فيها، وعلى رأسها الفواصل الزائدة أو الدخيلة، التي قد تشوه بنية السجلات النصية وتعيق عمليات التحويل الرقمي أو المطابقة الدقيقة بين الجداول المترابطة.

إن الفواصل، رغم بساطتها الظاهرية، تمثل عنصراً إشكالياً مركباً؛ فهي قد ترد كفواصل آلاف داخل نصوص رقمية ينبغي تحويلها إلى قيم حسابية، أو كفواصل هيكلية نتجت عن خطأ في تصدير واستيراد الملفات المفصولة بفواصل (CSV Files)، أو كأخطاء إدخال يدوي عشوائية شوهت أسماء الكيانات والفرق الرياضية والتصنيفات الجغرافية. إن إزالة هذه الفواصل بفعالية تتطلب فهماً عميقاً للأدوات البرمجية المتاحة داخل منظومة ساس، بدءاً من الدوال التبديلية المباشرة مثل دالة TRANSLATE، والدوال الانضغاطية الموجهة مثل دالة COMPRESS، وصولاً إلى أدوات الاستبدال المعجمي TRANWRD والتعابير النمطية المتقدمة (Perl Regular Expressions).

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

1. مقدمة نظرية حول معالجة السلاسل النصية وتنظيف البيانات في بيئة ساس (SAS)

1.1 أهمية تنظيف البيانات النصية في التحليلات الإحصائية

تعتمد مصداقية النتائج المستخلصة من التحليلات الإحصائية والنماذج التنبؤية، مثل نماذج الانحدار الخطي واللوجستي وخوارزميات التعلم الآلي، على نقاء البيانات الأولية الداخلة في بنائها. عندما تحتوي السلاسل النصية المستخدمة كمتغيرات فئوية أو مفاتيح تعريفية على شوائب مثل الفواصل غير المقصودة، فإن الخوارزميات تتعامل مع هذه القيم المشوهة كفئات مستقلة وفريدة. على سبيل المثال، إذا تكررت فئة معينة في قاعدة البيانات بثلاث صور مختلفة مثل “الرياض” و”,الرياض” و”الرياض,”، فإن معالجات الإحصاء الاستدلالي في ساس ستفصل هذه السجلات إلى ثلاث مستويات تصنيفية منفصلة، مما يؤدي إلى تفتت حجم العينة الإحصائية وتشوه توزيع التكرارات، وبالتالي انخفاض القوة الإحصائية للاختبارات وصدور قرارات خاطئة مبنية على تصنيفات مضللة.

علاوة على ذلك، تلعب المتغيرات النصية دوراً حاسماً في عمليات دمج الجداول والمطابقة المتقاطعة (Data Merging and Joining)؛ حيث تُستخدم الأسماء والأرقام التعريفية كمفاتيح أساسية (Primary Keys). إن وجود فاصلة واحدة شاردة في أحد السجلات يؤدي إلى فشل فوري في عملية الربط بين الجداول عبر لغة الاستعلامات البنيوية (PROC SQL) أو من خلال أوامر MERGE في خطوة البيانات. ينتج عن ذلك فقدان السجلات غير المتطابقة أو توليد قيم مفقودة تؤثر سلباً على سلامة مستودع البيانات. تفرض المعايير المنهجية لتدقيق البيانات الشروع في تطبيق بروتوكولات صارمة لتنظيف السلاسل الحرفية قبل الانتقال إلى أي مرحلة من مراحل النمذجة أو التحليل الاستكشافي المتقدم.

تتطلب هندسة البيانات المؤسسية توثيقاً دقيقاً لخطوات المعالجة القبلية لضمان قابلية تكرار التجربة (Reproducibility). إن إزالة الفواصل والرموز الملوثة ليست مجرد تحسين شكلي للبيانات، بل هي عملية تصحيح دلالي تعيد للمتغيرات معناها القياسي وتضمن اتساقها عبر كافة مراحل التحليل، بما يتوافق مع معايير جودة البيانات المعتمدة دولياً في المؤسسات المالية والطبية والبحثية الكبرى.

1.2 طبيعة الرموز غير المرغوب فيها وتحديات الفواصل الزائدة

تتسرب الفواصل إلى السلاسل النصية من مصادر متعددة؛ أبرزها أخطاء الإدخال البشري التراكمية في الأنظمة التشغيلية، حيث يقوم المستخدمون بكتابة الفواصل كفواصل ترقيم عادية داخل حقول النصوص الحرة المخصصة لأسماء الشركات أو المنتجات. المصدر الآخر، والأكثر انتشاراً في بيئات معالجة البيانات، هو عمليات التصدير والاستيراد غير المنضبطة للملفات النصية المفصولة بفواصل (Comma-Separated Values). عندما يحتوي النص الأصلي على فاصلة دون أن يكون محاطاً بعلامات اقتباس مزدوجة، فإن محركات القراءة تعامل هذه الفاصلة كمحدد لحقل جديد، مما يؤدي إلى ترحيل البيانات وتشتت الأعمدة وظهور الفواصل داخل نصوص لم تكن مخصصة لها أصلاً.

تتفاقم المشكلة عندما تتداخل الفواصل كمحددات هيكلية للملف مع الفواصل كبيانات مشوهة داخل الخلايا. ففي بيئة ساس، إذا لم يتم ضبط معاملات قراءة الملفات الخام بعناية (مثل استخدام DSD وDLM)، فإن محرك الإدخال سيفسر الفواصل الداخلية خطأً، مما يولد سلاسل نصية ملوثة بفواصل في بدايتها أو منتصفها أو نهايتها. وتزداد التعقيدات الهندسية عندما تتكرر الفواصل بصورة متتالية، كأن نجد سلسة نصية تحتوي على “,,” أو “,,,”، مما يشير إلى مسافات متروكة أو أخطاء تعبئة آلية متكررة تحتاج إلى تفكيك منهجي دقيق لاستئصال الرمز الشاذ دون تدمير السياق الدلالي للنص الحقيقي.

إن معالجة الفواصل المتناثرة في مواقع غير منتظمة داخل السلسلة تتطلب أدوات برمجية تمتلك قدرة على التمييز بين موضع الفاصلة ووظيفتها؛ فالفاصلة في وسط اسم مركب تتطلب قراراً برمجياً: هل تُستبدل بمسافة فارغة للحفاظ على انفصال الكلمات، أم تُحذف بالكامل لدمج الأجزاء؟ هذه القرارات تستدعي دراسة خصائص الدوال المتوفرة في ساس لتحديد الاستراتيجية المثلى لكل حالة.

1.3 نظرة عامة على دوال معالجة النصوص في خطوة البيانات (DATA Step)

يعتمد محرك خطوات البيانات في نظام ساس على بنية معمارية فريدة تُعرف باسم “متجه بيانات البرنامج” (Program Data Vector – PDV)، وهي منطقة ذاكرة وسيطة يتم فيها معالجة الملاحظات سجلاً تلو الآخر. عند التعامل مع المتغيرات الحرفية، يفرض نظام ساس تحديد طول ثابت لكل متغير في الذاكرة، ويتم تعبئة الفراغات المتبقية بمسافات فارغة لاحقة (Trailing Blanks). تتيح بيئة ساس ترسانة متكاملة من الدوال لمعالجة هذه المتغيرات، وتنقسم وظيفياً إلى دوال الحذف والتقليص، ودوال الاستبدال المباشر، ودوال البحث والتطابق، ودوال التقطيع المعجمي.

تتميز دوال معالجة النصوص في ساس بكفاءتها العالية في إدارة تخصيص الذاكرة على مستوى البايت، حيث تتعامل مباشرة مع الترميز الداخلي للمحارف سواء كان بترميز ASCII أحادي البايت أو UTF-8 متعدد البايت. تبرز دالة TRANSLATE كأداة استبدال محرفية فورية تقوم بمطابقة المحارف وتبديلها واحداً بواحد، بينما تمثل دالة COMPRESS أداة الإزالة والضغط الأكثر مرونة واستخداماً، وتوفر دالة TRANWRD حلاً لمعالجة الكلمات والمقاطع الفرعية، في حين تمنح دوال التعابير النمطية PRX المحلل قدرات استثنائية لمطابقة الأنماط المعقدة.

إن الاختيار الصائب بين هذه الدوال يعتمد على فهم دقيق لكيفية تفاعل كل دالة مع طول المتغير في الـ PDV، وسلوكها تجاه المسافات البيضاء، وتكلفتها الحسابية عند معالجة جداول مليونية. إن إتقان هذه الدوال يمثل الفارق الجوهري بين كود برمجي بطيء يستهلك موارد الخادم وكود عالي التحسين ينفذ مهام تنظيف البيانات في أجزاء من الثانية.

2. المفهوم الأساسي لدالة TRANSLATE ودورها في استبدال المحارف

2.1 البنية النحوية العامة لدالة TRANSLATE وسلوكها التشغيلي

تُعد دالة TRANSLATE واحدة من أقدم وأقوى الدوال في لغة ساس، وهي مصممة لإجراء عمليات استبدال المحارف على أساس المقابلة المباشرة لموضع الرمز (Character-by-Character Mapping). تتبع الدالة بنية نحوية محددة وصارمة تأخذ الشكل التالي: TRANSLATE(source, to, from). في هذه الصيغة، يمثل الوسيط الأول (source) السلسلة النصية أو المتغير الحرفي المراد تعديله، بينما يمثل الوسيط الثاني (to) مجموعة المحارف البديلة التي ستحل محل المحارف المستهدفة، في حين يحدد الوسيط الثالث (from) مجموعة المحارف الأصلية المطلوب استبدالها والبحث عنها داخل النص.

تعمل الدالة بآلية المسح المتتابع على مستوى البايت؛ حيث تفحص كل محرف في المتغير الأصلي، فإذا تطابق مع أي محرف مذكور في وسيط البحث (from)، فإنها تستبدله فوراً بالمحرف المقابل له في نفس الموضع الترتيبي داخل وسيط الاستبدال (to). وإذا كان طول الوسيط (to) أقل من طول الوسيط (from)، فإن ساس يكمل الوسيط (to) بمسافات فارغة حتى يتساوى الطولان. أما إذا كان الوسيط (to) أطول، فإن المحارف الزائدة يتم تجاهلها تماماً أثناء المعالجة، مما يجعل سلوك الدالة حتمياً ودقيقاً للغاية في إدارة تبديل المحارف.

تختلف دالة TRANSLATE جوهرياً عن دوال الاستبدال النصي الأخرى مثل TRANWRD؛ إذ إنها لا تبحث عن تسلسل كامل لكلمة أو مقطع فرعي، بل تنظر إلى كل حرف في الوسيط الثالث ككيان مستقل تماماً. هذا يعني أن الدالة سريعة جداً على مستوى المعالج المركزي، لأنها تعتمد على جداول تعيين المحارف المباشرة دون الحاجة إلى تشغيل خوارزميات البحث المعقدة في السلاسل النصية.

2.2 آلية استبدال الفواصل بمحارف فارغة عبر TRANSLATE

عند الرغبة في إزالة الفواصل باستخدام دالة TRANSLATE، يتم استهداف رمز الفاصلة اللاتينية المعتادة (,) بوضعه في الوسيط الثالث (from). ومن الناحية المنطقية، قد يفكر المبرمج في تمرير سلسلة نصية فارغة في الوسيط الثاني (to) لتحقيق الحذف، كأن يكتب التعبير: TRANSLATE(text, ”, ‘,’). في هذه الحالة، يتلقى محرك ساس وسيطاً بديلاً بطول صفري، وبحسب القواعد التشغيلية للدالة، يقوم المحرك تلقائياً بتمديد هذا الوسيط الفارغ ليصبح مسافة بيضاء واحدة (Blank Space) ليطابق طول رمز الفاصلة المستهدف.

نتيجة لهذا السلوك الهيكلي، فإن دالة TRANSLATE لا تقوم بحذف الفاصلة بالمعنى الحرفي للإلغاء الموضعي، بل تقوم باستبدال الفاصلة بمسافة فارغة. إذا كان النص الأصلي يحتوي على السلسلة “Alpha,Beta”، فإن تطبيق الدالة بهذه الصورة سيحولها إلى “Alpha Beta”. يعد هذا التأثير مفيداً في السياقات التي تتطلب الحفاظ على الفصل بين المفردات، لكنه يمثل عائقاً إذا كان الهدف هو إزالة الرمز دون ترك أي أثر فراغي مكانه، كما هو الحال في تنظيف المعرفات الرقمية أو الأسماء المتصلة.

تظهر الآثار الجانبية لهذا الاستبدال بوضوح عند وجود فواصل متعددة ومتتالية؛ فالسلسلة “Data,,,Science” ستتحول إلى “Data Science” بثلاث مسافات فارغة متتالية. ورغم أن الفواصل قد زالت بالكامل، إلا أن النص الناتج أصبح ملوثاً بفراغات بيضاء تشوه التنسيق الجمالي والهيكلي، مما يستلزم تدخلاً إضافياً لتهذيب هذه الفراغات وإعادة النص إلى طوله الطبيعي المتناسق.

2.3 القيود المنهجية لاستخدام TRANSLATE بمفردها لإزالة الرموز

يتمثل القيد المعماري الأول لدالة TRANSLATE في عجزها البنيوي عن تقليص الطول الفيزيائي الإجمالي للسلسلة النصية المعالجة. نظراً لأن الدالة تعمل على استبدال المحارف بمبدأ التناظر الفردي (One-to-One Substitution)، فإن عدد البايتات المحجوزة للمحتوى يظل ثابتاً، ولا تستطيع الدالة زحزحة المحارف التالية نحو اليسار لسد الفجوة الناتجة عن إزالة الرمز، بل تملأ الفجوة بمسافة بيضاء فارغة ذات ترميز بايت محدد.

هذا القيد يولد إشكالية في الأنظمة التي تشترط أن تكون المخرجات متصلة تماماً، كأكواد المنتجات أو أرقام الحسابات. إذا استُخدمت TRANSLATE وحدها، فإن الفواصل الموزعة عشوائياً في النص ستترك وراءها “ثقوباً” من المسافات البيضاء. وإذا كانت الفواصل تقع في بداية النص أو نهايته، فإن النص الناتج سيحتوي على مسافات بادئة أو لاحقة قد تؤثر على عمليات الترتيب الأبجدي والفهرسة داخل محرك قواعد بيانات ساس.

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

3. الدمج الفعال بين دالتي COMPRESS و TRANSLATE لإزالة الفواصل

3.1 مبررات الجمع بين الدوال في تعبير برمجي واحد

نشأت الحاجة إلى الجمع بين دالتي COMPRESS و TRANSLATE في سطر برمجي واحد لمعالجة التحديات التاريخية في الإصدارات المبكرة من نظام ساس، حيث كانت دالة COMPRESS في نسختها الكلاسيكية مصممة بالأساس لغرض وحيد ومحدد، وهو إزالة كافة المسافات البيضاء الفارغة من السلسلة النصية دون وجود وسائط إضافية لتحديد محارف معينة للحذف. وبناءً على هذا القيد القديم، كان من المستحيل استخدام COMPRESS مباشرة لحذف الفاصلة دون حذف المسافات بين الكلمات.

من هنا، ابتكر مهندسو ساس استراتيجية المعالجة متعددة المراحل داخل تعبير أحادي مدمج. تتمثل هذه المنهجية في استخدام دالة TRANSLATE أولاً لتحويل كافة الفواصل الموجودة في السلسلة النصية إلى مسافات بيضاء، ثم تمرير الناتج فوراً وبصورة لحظية إلى دالة COMPRESS التي تتولى مسح هذه المسافات المتولدة وإلغاءها بالكامل، مما يزحزح المحارف المتبقية نحو اليسار لسد الفجوات، وينتج عنه نص متماسك ومضغوط يخلو تماماً من أي فاصلة أو فراغ ناتج عنها.

يحقق هذا التضمين البرمجي ميزة تقليل عدد الأوامر وخطوات البيانات الفرعية، مما ينعكس إيجاباً على زمن المعالجة وتفادي إنشاء متغيرات وسيطة في الذاكرة تستنزف مساحة الـ PDV دون داعٍ. ورغم تطور لغة ساس في الإصدارات الحديثة، لا يزال هذا التعبير البرمجي المركب مستخدماً بكثافة في الأنظمة المصرفية والطبية المستقرة، مما يفرض على كل مبرمج ومحلل فهم أسرار عمله ومسوغاته التقنية.

3.2 تفكيك البنية البرمجية: compress(translate(string_var, ”, ‘,’))

لفهم الكيفية التي يعمل بها التعبير المركب compress(translate(string_var, ”, ‘,’))، يجب تتبع مسار التنفيذ الداخلي وفق قواعد الأسبقية البرمجية في محرك ساس؛ حيث يبدأ التنفيذ دائماً من الدالة الداخلية الأكثر عمقاً ويتجه نحو الخارج. في الخطوة الأولى، يتم استدعاء دالة TRANSLATE وتمرير المتغير النصي الأصلي إليها مع تحديد الفاصلة كرمز مطلوب تغييره واستبداله بقيمة فارغة ممتدة إلى مسافة بيضاء.

لنفترض أن لدينا متغيراً نصياً يحمل القيمة “A,B,C”. تقوم دالة TRANSLATE بمسح هذه السلسلة، وتتعرف على مواضع الفواصل، فتستبدل كلاً منها بمسافة بيضاء واحدة، فيتحول النص في الذاكرة المؤقتة إلى السلسلة “A B C”. هذه النتيجة الوسيطة لا يتم تخزينها في متغير دائم، بل تُمرر مباشرة كمدخل ومصدر إلى الدالة الخارجية المحيطة بها، وهي دالة COMPRESS.

في الخطوة الثانية، تتسلم دالة COMPRESS السلسلة “A B C”. وبما أنها تعمل وفق سلوكها الافتراضي التقليدي، فإنها تبحث عن كافة الفراغات والمسافات البيضاء في النص وتقتلعها جذرياً. يتم ضم الحرف “B” إلى الحرف “A”، والحرف “C” إلى “B”، لتصبح النتيجة النهائية الصادرة من التعبير البرمجي بأكمله هي السلسلة “ABC”. تضمن هذه التركيبة الرياضية البرمجية استئصالاً مطلقاً للفواصل وإعادة تجميع الحروف في كتلة واحدة منضبطة.

3.3 معالجة المسافات البيضاء وضمان سلامة الكلمات داخل النص

ينطوي استخدام الصيغة الكلاسيكية المركبة compress(translate(string_var, ”, ‘,’)) على مخاطرة منهجية جسيمة يجب الانتباه إليها عند تنظيف النصوص الحرة التي تتألف من عدة كلمات دلالية مستقلة. نظراً لأن دالة COMPRESS الافتراضية تزيل كافة المسافات البيضاء دون استثناء، فإن تطبيق هذا التعبير على نصوص تحتوي على مسافات شرعية بين الكلمات سيؤدي إلى كارثة تصنيفية؛ إذ سيتم دمج الكلمات المنفصلة ببعضها البعض قسرياً.

على سبيل المثال، إذا كانت السلسلة النصية الأصلية هي “Real, Madrid”، فإن دالة TRANSLATE ستحول الفاصلة إلى مسافة، ليصبح النص “Real Madrid” بمسافتين بين الكلمتين. وعندما تنفذ دالة COMPRESS عملها، فإنها ستمسح هاتين المسافتين بالكامل لتنتج السلسلة المشوهة “RealMadrid”. وفي سياقات نمذجة النصوص واسترجاع المعلومات، يُعد هذا دمجاً خاطئاً يدمر الكلمات المفتاحية ويمنع خوارزميات التقطيع النصي (Tokenization) من التعرف على المفردات المستقلة.

لتفادي هذا الأثر السلبي الحرج، يجب التمييز بوضوح بين المتغيرات التي يُقصد ضغط محتواها بالكامل (كالرموز المشفرة، وأكواد المنتجات، وأسماء الفرق الرياضية المركبة دون فواصل)، وبين النصوص الطبيعية التي يجب أن تظل كلماتها مفصولة بمسافة بيضاء قياسية واحدة. وفي الحالة الأخيرة، يفضل تجنب الصيغة الافتراضية غير الموجهة، والاعتماد على الحلول المتقدمة التي سنفصلها لاحقاً، والتي تزيل الرمز المستهدف وحده وتترك المسافات البينية آمنة.

4. الدليل التطبيقي خطوة بخطوة: إزالة الفواصل من بيانات الفرق الرياضية

4.1 إنشاء مجموعة البيانات التجريبية my_data وتحديد التشوهات

لترسيخ المفاهيم البرمجية عملياً، سنقوم بإنشاء بيئة تجريبية منضبطة في ساس تحاكي سيناريو واقعياً لمعالجة أسماء فرق رياضية ملوثة بفواصل عشوائية تم تصديرها من نظام إحصائي غير مهيأ. سنستخدم خطوة البيانات DATA my_data مع استخدام أوامر الإدخال المباشر INPUT و DATALINES لتعريف المتغيرات وتغذيتها بالسجلات المشوهة عمداً لاختبار كافة الحالات الهيكلية للفواصل.

سنعرف متغيرين أساسيين: المتغير النصي team بطول حرفي مناسب متبوعاً بعلامة الدولار ($) للإشارة إلى كونه متغيراً حرفياً، والمتغير الرقمي points لتمثيل نقاط الفريق في المسابقة الرياضية لتوضيح أن عمليات معالجة النصوص لا تؤثر إطلاقاً على سلامة المتغيرات الرقمية المجاورة داخل نفس السجل. تتضمن البيانات المدخلة فواصل في بداية النص، وفواصل مزدوجة في المنتصف، وفواصل في النهاية، وفواصل تحيط بالاسم بالكامل.

يتم بناء خطوة إدخال البيانات التجريبية بالشفرة البرمجية التالية:

DATA my_data;
    INPUT team $ points;
    DATALINES;
,Mavs, 22
Warriors 29
,Haw,ks 40
Spu,,rs 30
Celtics, 19
;
RUN;

يوضح هذا الكود إدخال خمسة سجلات متباينة؛ السجل الأول يحتوي على فاصلة بادئة وفاصلة ختامية، والسجل الثاني نقي تماماً ليمثل حالة الضبط المعياري، والسجل الثالث مشوه بفاصلة بادئة وأخرى في وسط الاسم، والسجل الرابع يحتوي على فاصلة مزدوجة في المنتصف، والسجل الخامس ينتهي بفاصلة لاحقة.

4.2 استعراض مجموعة البيانات الأصلية وتقييم مواضع الفواصل

قبل تطبيق أي خوارزمية تنظيف، تقتضي الممارسة الإحصائية الرصينة استعراض جدول البيانات الأولي وتوثيق التشوهات لتقييم حجم المشكلة والتأكد من مطابقة السجلات لواقع المعاينة. نستخدم الإجراء الطباعي الشهير PROC PRINT في ساس لعرض محتويات الجدول my_data في نافذة المخرجات (Output/Results Viewer).

يتم استدعاء الإجراء من خلال الكود البسيط التالي:

PROC PRINT DATA=my_data;
RUN;

يُظهر تقرير الفحص الأولي أن المتغير team يعاني من عدم اتساق صارخ؛ حيث يظهر الفريق “Mavs” محاطاً بفواصل تجعل البحث عنه كفئة نصية يفشل إذا استعلمنا عن “Mavs” النظيفة. كما يظهر الفريق “Hawks” مقسوماً إلى مقطعين بفاصلة وسطية وأخرى بادئة “,Haw,ks”، ويبرز الفريق “Spurs” بتكرار فاصلتين متجاورتين “Spu,,rs”. هذا التقرير يشكل خط الأساس (Baseline) الذي سنقارن به نتائجنا بعد إتمام خطوة المعالجة لتأكيد زوال كل التشوهات بدقة مطلقة.

4.3 تنفيذ كود المعالجة وتوليد مجموعة البيانات النظيفة new_data

ننتقل الآن إلى المرحلة التنفيذية الحاسمة؛ حيث نؤسس خطوة بيانات جديدة باسم DATA new_data لقراءة السجلات من الجدول السابق عبر عبارة SET my_data. داخل هذه الخطوة، سنطبق المعادلة التحويلية المركبة على عمود الفريق: team = compress(translate(team, ”, ‘,’)); لمعالجة كل سجل على حدة بصورة تتابعية أثناء مروره في متجه بيانات البرنامج (PDV).

يتم كتابة الشفرة البرمجية المكتملة للمعالجة وفق الهيكل التالي:

DATA new_data;
    SET my_data;
    team = compress(translate(team, ”, ‘,’));
RUN;

عند تشغيل هذا الكود، يقرأ محرك ساس كل ملاحظة، ويقوم بتطبيق دالة TRANSLATE لتحويل أي فاصلة في المتغير team إلى مسافة، ثم تقوم دالة COMPRESS فوراً بإزالة تلك المسافات وكافة الفراغات المحيطة بها. يتم بعد ذلك إعادة إسناد القيمة النظيفة إلى نفس المتغير team، مما يؤدي إلى تحديث محتواه في الذاكرة وكتابته في الجدول النهائي new_data.

تكتمل الخطوة بأمر RUN الذي ينهي التنفيذ، ويجب على المبرمج في هذه اللحظة فحص سجل النظام (SAS Log) للتأكد من عدم وجود أي رسائل خطأ (Errors) أو تحذيرات (Warnings)، والتثبت من أن عدد الملاحظات المقروءة يطابق تماماً عدد الملاحظات المكتوبة في الجدول الجديد دون أي فقد في البيانات.

4.4 التحقق من النتائج وتقييم المخرجات عبر PROC PRINT

لإغلاق حلقة المعالجة والتحقق تجريبياً من نجاح العملية الهندسية، نستدعي إجراء العرض مجدداً ولكن على الجدول المنظف new_data باستخدام الشفرة التالية:

PROC PRINT DATA=new_data;
RUN;

عند فحص النتائج المعروضة في تقرير PROC PRINT الجديد، يتضح التحول النوعي في البيانات؛ حيث تحولت القيمة “,Mavs,” إلى “Mavs” الصافية تماماً من أي زوائد، واستعاد الفريق “,Haw,ks” هيكله الصحيح ليصبح “Hawks”، بينما اندمجت أحرف “Spu,,rs” لتشكل الكلمة المستهدفة “Spurs”، وتم تجريد “Celtics,” من الفاصلة اللاحقة ليصبح “Celtics”، في حين ظل الفريق “Warriors” كما هو دون أن يمسه أي تشويه أو تعديل جانبي.

والأمر البالغ الأهمية في تقييم المخرجات هو ثبات المتغير الرقمي points؛ إذ احتفظت كافة الفرق بنقاطها الإحصائية الأصلية (22، 29، 40، 30، 19) دون أي إزاحة في الأعمدة أو خلل في المحاذاة. يؤكد هذا التطبيق نجاح التقنية في عزل المتغير المستهدف وتطهيره بنسبة 100%، مما يمهد الطريق لاستخدام هذه البيانات في إعداد التقارير أو النماذج الإحصائية دون خوف من أخطاء التصنيف النصي.

5. الطريقة المباشرة الأبسط: استخدام دالة COMPRESS بمفردها مع المحددات

5.1 الإمكانيات المتقدمة لدالة COMPRESS في الإصدارات الحديثة من SAS

مع إطلاق الإصدار التاسع من نظام ساس (SAS Version 9)، شهدت دالة COMPRESS ثورة تطويرية كبرى جعلتها تتجاوز وظيفتها التقليدية المقتصرة على حذف الفراغات. أضاف مطورو النظام وسائط ومعاملات إضافية منحت الدالة مرونة تشغيلية هائلة؛ حيث أصبحت بنيتها الحديثة تتسع لثلاثة وسائط رئيسية: COMPRESS(source, characters, modifiers).

الوسيط الأول يمثل السلسلة النصية المصدرية المراد معالجتها، والوسيط الثاني يسمح للمبرمج بتمرير قائمة نصية بالمحارف المحددة الدقيقة المطلوب اقتلاعها وحذفها من النص، في حين يمثل الوسيط الثالث معامِلات التعديل (Modifiers) التي تتحكم في سلوك البحث والحذف (مثل تجاهل حالة الأحرف ‘i’، أو الإبقاء فقط على المحارف المحددة وعكس وظيفة الدالة ‘k’، أو حذف علامات الترقيم ‘p’).

هذا التطوير الجوهري ألغى الحاجة الماسة لاستخدام الحيل البرمجية المركبة مثل دمج TRANSLATE مع COMPRESS؛ إذ أتاح للمحلل استهداف أي رمز أو علامة ترقيم مباشرة بخطوة إجرائية أحادية فائقة الوضوح، مما جعل الكود أكثر رشاقة، وأسهل في القراءة والفهم، وأقل عرضة للأخطاء العرضية أثناء الصيانة البرمجية.

5.2 التطبيق المباشر لحذف الفاصلة: compress(string_var, ‘,’)

يتمثل التطبيق المباشر والأكثر أناقة في لغة ساس الحديثة لإزالة الفواصل في كتابة التعبير البرمجي البسيط: compress(string_var, ‘,’). في هذه الصيغة، نمرر المتغير الحرفي في الوسيط الأول، ونضع رمز الفاصلة اللاتينية داخل علامتي اقتباس في الوسيط الثاني، دون الحاجة إلى كتابة أي وسيط ثالث إذا كان غرضنا محصوراً في إزالة الفاصلة بعينها.

الميزة الجوهرية والاستثنائية لهذا الأسلوب المباشر تكمن في الحفاظ المطلق على كافة المسافات البيضاء الطبيعية الفاصلة بين الكلمات. فعندما يتم تمرير وسيط المحارف الثاني إلى دالة COMPRESS، يتغير سلوكها الافتراضي فوراً؛ فلا تعود تزيل الفراغات ما لم يتم إدراج المسافة البيضاء صراحة ضمن قائمة المحارف في الوسيط الثاني.

إذا طبقنا هذا التعبير على سلسلة معقدة تحتوي على كلمات وفواصل مثل: “Los Angeles, Lakers, Basketball”، فإن الناتج سيكون: “Los Angeles Lakers Basketball”. لقد تم استئصال الفواصل بنجاح تام مع بقاء الفراغات البينية بين كلمات “Los Angeles” و”Lakers” سليمة دون أي مساس، مما يحل المشكلة الكلاسيكية التي كانت تؤرق المبرمجين في الصيغ المركبة القديمة ويوفر حلاً مثالياً للنصوص متعددة الكلمات.

5.3 مقارنة الأداء بين الطريقة المركبة والطريقة المباشرة

عند معالجة مجموعات البيانات الضخمة (Big Data) التي تحتوي على عشرات أو مئات الملايين من السجلات الحرفية، يصبح التقييم الهندسي للأداء واستهلاك وحدة المعالجة المركزية (CPU Time) والذاكرة أمراً حاسماً في المفاضلة بين الأساليب البرمجية. إن تنفيذ الطريقة المركبة compress(translate(…)) يفرض على المحرك استدعاء دالتين مستقلتين في الذاكرة لكل سجل فردي؛ حيث تتولى الدالة الأولى إنشاء تمثيل وسيط للبيانات في الذاكرة اللحظية، ثم تستدعي الدالة الثانية لمعالجة هذا التمثيل وحذفه.

في المقابل، فإن استخدام الطريقة المباشرة compress(string_var, ‘,’) يستدعي دالة واحدة محسنة ومكتوبة بلغة C المنخفضة المستوى ضمن نواة ساس التحتية. تقوم هذه الدالة بمسح أحادي المسار (Single-Pass Scan) على بايتات السلسلة النصية، وتقوم بنسخ المحارف غير المطابقة للفاصلة مباشرة إلى موقع الإخراج في خطوة واحدة دون توليد أي وسائط مؤقتة في الذاكرة.

تؤكد الاختبارات القياسية المعملية (Benchmarking) أن الطريقة المباشرة تتفوق على الطريقة المركبة بفارق ملموس في زمن التنفيذ يتراوح بين 25% إلى 40% عند تشغيلها على بيئات إنتاجية مليونية. ولهذا السبب، فإن التوصيات الهندسية المعتمدة لدى مطوري ساس تنص بوضوح على اعتماد دالة COMPRESS المفردة مع تحديد المحارف في الوسيط الثاني كمعيار ذهبي رسمي لكافة المشاريع البرمجية الحديثة.

6. استخدام دالة TRANWRD والتعابير النمطية (PRX) كبدائل متقدمة

6.1 توظيف دالة TRANWRD لاستبدال الكلمات والرموز المحددة

تُعد دالة TRANWRD أداة استبدال متطورة تتعامل مع السلاسل النصية على مستوى المقاطع والكلمات الفرعية، وتأخذ البنية النحوية التالية: TRANWRD(source, target, replacement). تختلف هذه الدالة جذرياً عن دالة TRANSLATE؛ إذ إنها لا تستبدل حرفاً بحرف، بل تبحث عن السلسلة المستهدفة الكاملة (target) أينما وردت في النص المصدر (source) وتستبدلها بالكامل بالسلسلة البديلة (replacement).

عند توظيف TRANWRD للتخلص من الفواصل، يمكننا استبدال الفاصلة بسلسلة نصية فارغة تماماً عبر كتابة التعبير: TRANWRD(string_var, ‘,’, ”). تقوم الدالة بالبحث عن كل ظهور لرمز الفاصلة وتزيله ليحل محله الفراغ الصفري. ومن المزايا الإضافية لهذه الدالة أنها تمنح المحلل القدرة على استبدال الفاصلة بمسافة بيضاء منضبطة، كأن نكتب TRANWRD(string_var, ‘,’, ‘ ‘)، مما يتيح فك التشابك بين الكلمات الملتصقة بالفاصلة دون دمجها.

تظهر قوة TRANWRD في معالجة الحالات النمطية الجزئية؛ مثل استبدال فواصل محددة تقع في سياق معين، كاستبدال “, ” (فاصلة متبوعة بمسافة) بمسافة واحدة فقط، مع الإبقاء على الفواصل الأخرى التي لا ينطبق عليها هذا الشرط، وهو أمر يعجز عنه كل من COMPRESS و TRANSLATE البسيطتين، مما يجعل TRANWRD أداة جسرية ممتازة بين الدوال الحرفية البسيطة ومحركات الأنماط المتقدمة.

6.2 القوة التعبيرية لدوال التعابير النمطية (PRXCHANGE) في SAS

توفر لغة ساس تكاملاً مع محرك لغة بيرل للتعابير النمطية (Perl Regular Expressions – PRX)، مما يمنح محلل البيانات قدرات غير محدودة للتعامل مع أكثر النصوص تعقيداً وتشويهاً. وتبرز دالة PRXCHANGE كأقوى دالة استبدال نمطي في النظام، وتُبنى بصيغتها النموذجية كالتالي: PRXCHANGE(‘s/,//’, -1, string_var).

يشير الحرف ‘s’ في التعبير النمطي إلى أمر الاستبدال (Substitution)، والمحرف المحصور بين الشرطتين الأوليين هو الفاصلة المستهدفة (,)، والمساحة المحصورة بين الشرطتين الأخيرتين تمثل البديل الفارغ، في حين يشير الرقم (-1) في الوسيط الثاني إلى تكرار عملية الاستبدال لكل الفواصل الموجودة في السلسلة دون توقف عند الظهور الأول. هذه القوة التعبيرية تتيح للمحلل صياغة شروط استبدال فائقة التعقيد؛ مثل إزالة الفواصل التي لا يتبعها رقم، أو إزالة الفواصل المحصورة بين حروف معينة دون غيرها عبر استخدام محددات المواقع المتقدمة (Lookahead and Lookbehind Assertions).

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

6.3 المفاضلة الهندسية بين الدوال القياسية ومحرك التعابير النمطية

على الرغم من الإمكانيات غير المحدودة لمحرك التعابير النمطية (PRX)، إلا أن توظيفه يفرض تكلفة حسابية باهظة (Computational Overhead) على معالج الخادم. يتطلب استدعاء PRXCHANGE قيام محرك ساس بترجمة التعبير النمطي (Pattern Compilation) وإنشاء آلة حالات منتهية قطعية أو غير قطعية (DFA/NFA Engine) في الذاكرة لتتبع النصوص، مما يستهلك دورات معالجة إضافية ملحوظة مقارنة بالدوال الحرفية المبنية في النواة.

يوضح الجدول المنهجي التالي المقارنة الشاملة بين هذه الأدوات البرمجية من حيث الاستخدام والكفاءة وحفظ المسافات:

الأداة البرمجية الصيغة النموذجية حفظ المسافات الطبيعية التعقيد الحسابي والسرعة الحالة النموذجية للاستخدام
COMPRESS (المباشرة) compress(var, ‘,’) نعم، تحفظ المسافات بدقة فائقة السرعة ومنخفضة التكلفة إزالة الفواصل القياسية في المشاريع الحديثة
COMPRESS + TRANSLATE compress(translate(var,”,’,’)) لا، تمسح كافة الفراغات متوسطة (استدعاء مزدوج للدوال) الأنظمة القديمة وتوحيد الأكواد المتصلة
TRANWRD tranwrd(var, ‘,’, ”) نعم، مع إمكانية التبديل بفراغ سريعة إلى متوسطة استبدال الفواصل بمقاطع أو فك التصاق الكلمات
PRXCHANGE prxchange(‘s/,//’, -1, var) مرنة جداً حسب صياغة النمط أعلى استهلاكاً لموارد المعالج إزالة الفواصل المشروطة بأنماط سياقية معقدة

بناءً على هذه المفاضلة الهندسية، يجب الالتزام بالقاعدة القياسية: اعتمد دائماً على compress(var, ‘,’) كخيارك الافتراضي الأول، ولا تلجأ إلى PRXCHANGE إلا عندما تعجز كافة الدوال القياسية عن مطابقة الشروط السياقية للمشكلة البيانية محل المعالجة.

7. التعامل مع الفواصل في الأرقام المخزنة كنصوص وتحويلها إلى قيم رقمية

7.1 مشكلة فواصل الآلاف المضمنة في السلاسل النصية الرقمية

تمثل القيم الرقمية المخزنة كسلاسل نصية إحدى أكثر المعضلات شيوعاً في قواعد البيانات المالية والمحاسبية؛ حيث يتم في كثير من الأحيان تصدير أرقام مثل المبيعات أو الأرصدة المصرفية متضمنة فواصل الآلاف القياسية (مثل ‘1,500,000.50’ أو ‘25,000’). عندما يقرأ محرك ساس هذه البيانات، فإنه يتعامل معها تلقائياً كمتغيرات حرفية نظراً لاحتوائها على رمز الفاصلة غير الرقمي.

يترتب على هذا التخزين الخاطئ امتناع محرك ساس تماماً عن إجراء أي عمليات حسابية أو إحصائية؛ فلا يمكن للمحلل حساب المتوسط الحسابي عبر PROC MEANS، أو إدخال هذه المتغيرات في نماذج الانحدار، وإذا حاول إجبار النظام على حسابها حسابياً، فستسجل بيئة ساس تحذيرات من نوع (Mathematical Operation on Character Variable) مع تحويل فاشل ينتج عنه قيم مفقودة (Missing Values).

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

7.2 التحويل الآمن باستخدام دالة INPUT مع محددات التنسيق المناسبة

لتحويل السلسلة النصية الرقمية الملوثة بفواصل إلى رقم حقيقي منضبط، توفر لغة ساس مسارين علاجيين بالغي الدقة. المسار الأول هو المسار اليدوي الذي يعتمد على تجريد السلسلة أولاً باستخدام دالة COMPRESS، ثم تغذية الناتج النظيف إلى دالة INPUT الإنشائية عبر الصيغة: clean_num = INPUT(compress(num_string, ‘,’), best12.);. يقوم هذا الكود بحذف الفاصلة لتصبح السلسلة “1500000.50”، ثم تقرأ دالة INPUT الرقم النظيف بصيغة الأرقام العامة وتخزنه كمتغير رقمي خالص في الـ PDV.

أما المسار الثاني، وهو الأسلوب الهندسي الأرقى والأكثر فاعلية في ساس، فيتمثل في استغلال قوة التنسيقات الإدخالية الجاهزة (Informatics)، وتحديداً تنسيق COMMAw.d. بدلاً من إزالة الفواصل يدوياً، يمكن للمحلل كتابة: clean_num = INPUT(num_string, comma18.);. يتعرف محدد التنسيق COMMA تلقائياً على فواصل الآلاف وعلامات الدولار والنسب المئوية، ويتجاهلها بذكاء مطلق أثناء قراءة القيمة، محولاً إياها إلى رقم حسابي دون كتابة دالة COMPRESS على الإطلاق.

يمنع استخدام التنسيق COMMA ظهور أخطاء القراءة البيانية الشائعة مثل (Invalid Data for Variable) في سجل النظام (SAS Log)، كما يضمن سلامة التعامل مع الفواصل العشرية مقابل فواصل الآلاف في البيئات الدولية، شريطة الانتباه إلى ترميزات النظام المحلي (LOCALE Options) لضمان عدم الخلط بين النقطة والفاصلة العشرية المعتمدة في بعض الدول الأوروبية.

7.3 إدارة القيم المفقودة وحالات الشذوذ في البيانات الرقمية الملوثة

في بيئات البيانات الميدانية الواقعية، غالباً ما تحتوي الجداول على سجلات شاذة للغاية لا تقتصر على فواصل بين أرقام، بل تتعداها إلى خلايا تحتوي على رموز فواصل فقط دون أي أرقام (مثل “,” أو “,,” أو مسافات تتخللها فواصل)، والتي تنتج عن تفريغ يدوي غير مكتمل لحقول الإدخال. إذا طُبقت دالة INPUT على مثل هذه السلاسل دون تدقيق مسبق، فإن ساس سيعتبرها بيانات غير صالحة ويسجل ملاحظات خطأ في الـ Log.

لإدارة هذه الحالات بانضباط احترافي، يجب تطبيق آليات التحقق المنطقي قبل الشروع في التحويل الحسابي. يمكن للمبرمج توظيف شرط فحص يفصل السجلات الصالحة عن الشاذة كالتالي:

IF NOT MISSING(compress(num_string, ‘, ‘)) THEN DO;
    numeric_val = INPUT(compress(num_string, ‘,’), comma18.);
END;
ELSE DO;
    numeric_val = .;
END;

تضمن هذه الشفرة أنه إذا أدت عملية إزالة الفواصل والمسافات إلى الحصول على نص فارغ تماماً، فإن النظام يعين للمتغير قيمة مفقودة نظامية (.) دون تشغيل دالة INPUT على فراغ مشوه، مما يحمي سجل النظام من التحذيرات المربكة ويضمن سلامة الإحصاءات الوصفية للبيانات المالية والمحاسبية.

8. معالجة الفواصل عبر عدة أعمدة ومجموعات بيانات ضخمة باستخدام المصفوفات (Arrays)

8.1 تأسيس مصفوفات المتغيرات الحرفية في خطوة البيانات

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

توفر لغة ساس حلاً معمارياً عبقرياً يتمثل في إنشاء مصفوفات مؤقتة للمتغيرات (SAS Arrays) داخل خطوة البيانات. تتيح مصفوفة المتغيرات تجميع عدد لا نهائي من الأعمدة الحرفية تحت اسم مرجعي موحد دون الحاجة إلى إنشاء هياكل بيانات جديدة. يتم تأسيس المصفوفة الشاملة لكافة المتغيرات الحرفية باستخدام الكلمة المحجوزة _CHARACTER_ عبر العبارة التالية: ARRAY text_cols(*) _CHARACTER_;.

تخبر علامة النجمة (*) محرك ساس بحساب أبعاد المصفوفة تلقائياً بناءً على عدد المتغيرات الحرفية المعرفة في الجدول، بينما تشير الكلمة المفتاحية _CHARACTER_ إلى استهداف كل عمود نصي في السجل دون الحاجة لكتابة أسمائها الفردية، مما يؤسس منصة برمجية جاهزة لتطبيق عمليات التنظيف الدفعي الشاملة بأعلى مستويات الكفاءة.

8.2 تنفيذ حلقة DO التكرارية لمعالجة كافة المتغيرات النصية دفعة واحدة

بمجرد تعريف المصفوفة النصية، يتم بناء حلقة تكرارية محكمة باستخدام عبارة DO المرتبطة بدالة تحديد الأبعاد DIM. تمر الحلقة على كل عنصر في المصفوفة بالتتابع لتطبق عليه دالة إزالة الفواصل وتستبدل محتواه القديم بالقيمة النظيفة فوراً داخل نفس دورة الـ PDV.

تتجلى أناقة هذه البنية البرمجية في الكود المدمج التالي:

DATA cleaned_large_data;
    SET raw_large_data;
    ARRAY text_vars(*) _CHARACTER_;
    DO i = 1 TO DIM(text_vars);
        text_vars(i) = compress(text_vars(i), ‘,’);
    END;
    DROP i;
RUN;

يقوم هذا الكود المختصر بتنظيف عشرات الأعمدة النصية في جزء من الثانية؛ حيث يعالج المتغير text_vars(i) كمرآة تعكس العمود الحقيقي في موقعه بالذاكرة. وتُستخدم عبارة DROP i; في نهاية الخطوة لضمان عدم حفظ متغير المؤشر التكراري (i) في الجدول النهائي، مما يبقي البيانات نظيفة وخالية من أي حقول وسيطة غير مرغوب فيها.

8.3 استراتيجيات كفاءة المعالجة في قواعد البيانات الضخمة (Big Data Optimization)

في بيئات مستودعات البيانات الكبرى (Data Warehouses) التي تتعامل مع جداول تتجاوز أحجامها مئات الجيجابايت، يمثل خفض عمليات الإدخال والإخراج (I/O Bottlenecks) التحدي التشغيلي الأهم. عند معالجة الفواصل في مثل هذه البيئات، يجب تحسين استهلاك الذاكرة عبر منع التضخم العشوائي لأطوال المتغيرات الحرفية.

تتضمن أفضل الممارسات استخدام خيارات الذاكرة المؤقتة لخطوة البيانات مثل BUFSIZE و BUFNO لزيادة حجم صفحات البيانات المنقولة بين القرص الصلب والذاكرة العشوائية، مما يتيح لمحرك ساس معالجة آلاف الملاحظات في كل دفعة قراءة. كما ينبغي تجنب استخدام المتغيرات الحرفية ذات الأطوال المفرطة عبر استخدام أمر LENGTH الموجه لضبط الحجم الدقيق للمتغيرات قبل بدء حلقة التكرار.

علاوة على ذلك، في الحالات التي لا تتطلب كتابة كافة السجلات في جدول دائم جديد، يُفضل استخدام عبارات التصفية المباشرة (مثل WHERE) داخل خطوة القراءة لمعالجة السجلات المستهدفة بالتحليل فقط، مما يقلل الجهد الحاسوبي المبذول في تنظيف سجلات لن تدخل في التحليلات الإحصائية اللاحقة.

9. الأخطاء الشائعة وحالات الحافة التقنية عند إزالة الفواصل في ساس

9.1 الخلط بين الفواصل الإنجليزية والفواصل العربية والفواصل العشرية

من أخطر الأخطاء الشائعة في معالجة البيانات النصية ثنائية اللغة (العربية والإنجليزية)، أو في بيئات العمل متعددة الجنسيات، تجاهل حقيقة وجود أشكال ترميزية متباينة جذرياً لعلامة الفاصلة في معيار الترميز الموحد (Unicode Standard). الفاصلة اللاتينية المعتادة في الإنجليزية يمثلها المحرف (,) ورمزه السداسي عشري هو (0x2C)، بينما الفاصلة العربية تمثلها علامة مختلفة تماماً وهي (،) ورمزها السداسي عشري في اليونيكود هو (0x060C).

إذا كتب المبرمج أمراً مثل compress(text, ‘,’) بهدف تنظيف نص يحتوي على نصوص عربية مشوهة بفواصل عربية، فإن الدالة لن تزيل أي فاصلة عربية على الإطلاق؛ لأنها تبحث بدقة بايتية عن الرمز 0x2C فقط وتتجاهل الرمز 0x060C. ولحل هذه الإشكالية، يجب تمرير كلا الرمزين داخل وسيط الحذف لدالة COMPRESS كالتالي: compress(text, ‘,،’).

يضاف إلى ذلك ضرورة الحذر التام عند معالجة ملفات مصدرها بيئات أوروبية (كالفرنسية أو الألمانية)؛ حيث تستخدم الفاصلة اللاتينية كفاصلة عشرية (Decimal Separator) بدلاً من النقطة. إن إزالة الفواصل بصورة عمياء من هذه البيانات سيحول القيمة “12,5” إلى “125”، مما يضاعف الرقم عشر مرات ويفسد القياسات الإحصائية بصورة كارثية لا يمكن استدراكها إلا بتطبيق فحص لغوي وبيئي مسبق لملفات المصدر.

9.2 اقتطاع السلاسل النصية ومشكلات تحديد أطوال المتغيرات (Length Truncation)

يتبع نظام ساس قاعدة صارمة في تحديد الطول الحرفي للمتغيرات (Variable Length Rules) داخل خطوة البيانات؛ حيث يتحدد طول أي متغير جديد بناءً على أول ظهور له في كود البرنامج. إذا قام المبرمج بإنشاء متغير جديد عبر دالة نصية دون تحديد طول مسبق، كأن يكتب: new_var = compress(old_var, ‘,’);، فإن ساس يمنح new_var نفس طول old_var في أغلب الحالات، ولكن إذا كان الإسناد الأول مرتبطاً بقيمة حرفية ثابتة أو دالة مركبة غير محددة الطول بدقة، فقد يحدد ساس طولاً افتراضياً قصيراً جداً (مثل 8 بايت أو 200 بايت).

يؤدي هذا السلوك إلى ظاهرة خطيرة تُعرف باسم “اقتطاع السلاسل النصية” (Length Truncation)؛ حيث يتم بتر نهايات الأسماء والبيانات الطويلة بصمت دون توقف البرنامج. وتظهر المشكلة بوضوح أكبر عند استخدام دوال مثل TRANWRD التي قد تعيد سلاسل أطول من المتغير الأصلي.

لتفادي هذا الخلل المعماري، يجب دائماً وبشكل قطعي وضع عبارة LENGTH في صدارة خطوة البيانات قبل أي استدعاء للدوال، مع تحديد الطول الأقصى الآمن للمتغير النصي كالتالي:

DATA safe_length_data;
    LENGTH team $50 clean_team$50;
    SET raw_data;
    clean_team = compress(team, ‘,’);
RUN;

يضمن هذا التأسيس الصريح تخصيص مساحة كافية في الـ PDV لمنع أي فقدان أو بتر للمحارف الحرفية أثناء عمليات التنظيف والتعديل.

9.3 التأثير على السجلات الفارغة (Missing Strings) وتوليد القيم غير المعرفة

يتصرف محرك ساس بطريقة خاصة عند تطبيق الدوال النصية على سلاسل فارغة (Missing Values) أو سلاسل تتألف حصرياً من مسافات بيضاء غير مرئية. عند تطبيق دالة COMPRESS أو TRANSLATE على متغير حرفي فارغ تماماً، تعيد الدالة سلسلة فارغة بنفس الطول المخصص للمتغير، ممتلئة بالمسافات البيضاء.

تكمن المخاطرة في أن بعض العمليات الإحصائية اللاحقة قد تتأثر بوجود مسافات خفية بدلاً من القيمة الفارغة المطلقة. علاوة على ذلك، إذا كانت القواعد البرمجية تتضمن شروطاً تعتمد على فحص الطول باستخدام دالة LENGTH، فإن السلسلة الفارغة الممتلئة بمسافات تعيد طولاً يساوي 1 في بعض إصدارات ساس القديمة بدلاً من 0، مما قد يربك خوارزميات التصفية المعتمدة على دالة LENGTH(var) = 0.

لضمان أقصى درجات الحماية البرمجية، يوصى بالتحقق من حالة المتغير قبل المعالجة باستخدام الدالة المعيارية CMISS أو MISSING، أو تطبيق دالة STRIP لقص المسافات المتبقية لضمان تحول النص الفارغ إلى قيمة مفقودة حقيقية ومعترف بها رسمياً في بيئة ساس.

10. ضبط جودة البيانات والتحقق المنهجي من صحة تنظيف النصوص

10.1 كتابة اختبارات التحقق الآلي من خلو النصوص من الفواصل

في بيئات الإنتاج الحساسة (مثل الرقابة الدوائية والتحليلات الجنائية المصرفية)، لا يكفي مجرد تطبيق كود التنظيف، بل يتعين كتابة اختبارات تحقق آلي مدمجة (Automated Quality Assertions) تتأكد برمجياً من خلو السجلات تماماً من الفواصل، وتطلق إشارات تحذيرية أو توقف تنفيذ البرنامج عند اكتشاف أي شذوذ باقٍ.

توفر لغة ساس دالتي البحث الشهيرتين INDEX و FIND للتحقق من وجود أي محرف داخل السلسلة. يمكن كتابة خطوة تحقق رقابية تفحص الجدول المنظف وترصد أي سجل يحتوي على فاصلة لم يتم استئصالها بالشكل المطلوب:

DATA _NULL_;
    SET cleaned_data;
    IF FIND(team, ‘,’) > 0 THEN DO;
        PUT “CRITICAL ERROR: Unremoved comma detected at record ” _N_ ” for value: ” team;
        ABORT CANCEL;
    END;
RUN;

تستخدم هذه الخطوة الجدول الوهمي _NULL_ الذي يعمل في الذاكرة دون كتابة أي جدول على القرص؛ حيث يقرأ كل سجل ويبحث عن الفاصلة عبر دالة FIND، فإذا وجدها يطبع رسالة خطأ حرجة في سجل الـ Log تتضمن رقم السجل المنكوب (_N_) والقيمة المشوهة، ويوقف تنفيذ باقي البرنامج فوراً عبر أمر ABORT CANCEL، مما يمنع تسرب البيانات الفاسدة إلى خطوط الإنتاج والتقارير التنفيذية.

10.2 توظيف إجراء PROC FREQ و PROC MEANS لرصد التغيرات

يمثل التحليل التكراري الاستكشافي أداة إحصائية فعالة لرصد أثر تنظيف السلاسل النصية على تركيبة البيانات العامة. يُعد إجراء PROC FREQ الوسيلة المثلى للتحقق من اندماج الفئات النصية التي كانت مشتتة قبل التنظيف؛ حيث يمكن مقارنة جدول التكرارات قبل وبعد المعالجة للتأكد من انخفاض عدد القيم الفريدة وتجمعها في الفئات الصحيحة.

يتم تنفيذ الإجراء التكراري بالكود التالي:

PROC FREQ DATA=cleaned_data;
    TABLES team / NOCUM NOPERCENT;
RUN;

إذا كان لدينا سابقاً ثلاث قيم متباينة للفريق بسبب الفواصل، فإن تقرير PROC FREQ سيظهر قيمة موحدة نقية بإجمالي تكرارات يعادل مجموع التكرارات السابقة تماماً. كما يُستخدم إجراء PROC MEANS على المتغيرات الرقمية المصاحبة للتحقق من عدم تغير المجموع الكلي (SUM) أو المتوسط (MEAN)، مما يوفر برهاناً رياضياً على أن عمليات تعديل النصوص لم تؤدِ إلى تشويه الأرقام الإحصائية الموازية.

10.3 توثيق عمليات التنظيف وإنشاء مسار تدقيق موثوق (Audit Trail)

تفرض معايير حوكمة البيانات الصارمة (مثل معايير هيئة الغذاء والدواء الأمريكية FDA 21 CFR Part 11) الاحتفاظ بمسار تدقيق كامل يوضح كافة التعديلات التي طرأت على السجلات الأصلية. وبناءً عليه، يُحظر في البيئات المنظمة الكتابة فوق المتغير الأصلي مباشرة واستبداله بقيمته المنظفة دون توثيق.

تتمثل الممارسة القياسية في الإبقاء على المتغير الأصلي الخام، وإنشاء متغير جديد للمحتوى المنظف، إلى جانب توليد متغير علمي ثنائي (Flag Variable) يشير إلى ما إذا كان السجل قد خضع لعملية إزالة الفواصل أم لا. يتيح هذا المسار للمدققين الخارجيين تتبع التغييرات ومقارنة القيمتين بدقة:

DATA audited_data;
    SET raw_data;
    team_clean = compress(team, ‘,’);
    IF team NE team_clean THEN comma_removed_flag = 1;
    ELSE comma_removed_flag = 0;
RUN;

يوفر هذا الهيكل سجلاً تاريخياً متكاملاً يدعم عمليات التدقيق والمساءلة المؤسسية ويثبت نزاهة البيانات الإحصائية المعالجة.

11. تحسين الكفاءة البرمجية واستهلاك الموارد في بيئات الإنتاج ومستودعات البيانات

11.1 قياس أداء استهلاك وحدة المعالجة المركزية (CPU Time) والذاكرة

لإجراء تقييم كمي دقيق لكفاءة دوال إزالة الفواصل في بيئات الإنتاج، يتيح نظام ساس خيارات مراقبة النظام الشاملة عبر الأمر: OPTIONS FULLSTIMER;. عند تفعيل هذا الخيار في مستهل البرنامج، يقوم محرك ساس بطباعة تفاصيل دقيقة للغاية في سجل الـ Log عقب انتهاء كل خطوة، تشمل زمن المعالجة بالمللي ثانية (CPU Time)، وزمن التنفيذ الكلي الفعلي (Elapsed Time)، وحجم الذاكرة المستهلكة (Memory Used).

عند مقارنة تشغيل دالة compress(var, ‘,’) المباشرة في مقابل التعبير المركب compress(translate(var,”,’,’)) على جدول اختباري يحتوي على 50 مليون سجل، تكشف سجلات FULLSTIMER بوضوح أن الطريقة المباشرة تستهلك زمناً حاسوبياً أقل بنسبة ملحوظة، كما تظهر استقراراً كبيراً في استهلاك الذاكرة، مما يعفي الخوادم المركزية من مخاطر نفاد الذاكرة الافتراضية أثناء معالجة الجداول الضخمة المتزامنة.

يساعد هذا التحليل المؤسسات على ترشيد تكاليف الحوسبة السحابية (مثل بيئات SAS on AWS أو Azure)؛ حيث ينعكس انخفاض دورات المعالجة مباشرة في تقليص فواتير استهلاك موارد الخوادم الموزعة.

11.2 استراتيجيات المعالجة داخل قواعد البيانات (In-Database Processing)

في البنى التحتية الحديثة، ترتبط بيئات ساس بمحركات قواعد بيانات علائقية ومستودعات بيانات متقدمة (مثل Teradata، Snowflake، و Oracle) عبر محولات SAS/ACCESS. في هذه الهيكليات، لا يُعد سحب ملايين السجلات النصية الملوثة عبر الشبكة إلى خادم ساس لمعالجتها فكرة هندسية صائبة نظراً لاختناقات نقل البيانات عبر الشبكة.

تتمثل الاستراتيجية المثلى في استغلال تقنية “المعالجة داخل قاعدة البيانات” (In-Database Processing) وتمرير دوال الاستبدال مباشرة إلى محرك قاعدة البيانات للتنفيذ في موضع التخزين. يمكن تحقيق ذلك عبر ميزة التمرير الصريح (Explicit SQL Pass-Through) باستخدام لغة PROC SQL كالتالي:

PROC SQL;
    CONNECT TO ORACLE (USER=admin ORAPW=secret PATH=orcl);
    EXECUTE (UPDATE customers SET company_name = REPLACE(company_name, ‘,’, ”)) BY ORACLE;
    DISCONNECT FROM ORACLE;
QUIT;

في هذا النموذج، تتولى خوادم Oracle تنفيذ دالة REPLACE محلياً في الذاكرة التخزينية للجدول دون إرسال أي بايت واحد عبر شبكة ساس، مما يحقق سرعة تنفيذ فائقة ويختصر زمن التنظيف من ساعات إلى ثوانٍ معدودة.

11.3 تصميم وحدات ماكرو ساس (SAS Macros) معيارية لمعالجة النصوص

لضمان إعادة استخدام الشفرة وتوحيد معايير تنظيف السلاسل النصية عبر كافة فرق العمل في المؤسسة، يتم بناء “وحدات ماكرو معيارية” (Modular SAS Macros). يتم تصميم الماكرو بحيث يستقبل اسم الجدول، وقائمة المتغيرات المراد تنظيفها، والمحارف المطلوب إزالتها كمعاملات مرنة (Dynamic Parameters).

يوضح الكود التالي تصميماً معيارياً احترافياً لماكرو إزالة الفواصل والرموز:

%MACRO CleanCommas(dataset=, varlist=, chars=%STR(%’,%’));
    %IF %SYSFUNC(EXIST(&dataset)) %THEN %DO;
        DATA &dataset._cleaned;
            SET &dataset;
            ARRAY text_vars {*} &varlist;
            DO i = 1 TO DIM(text_vars);
                text_vars{i} = compress(text_vars{i}, &chars);
            END;
            DROP i;
        RUN;
        %PUT NOTE: Dataset &dataset._cleaned successfully created.;
    %END;
    %ELSE %DO;
        %PUT ERROR: Target dataset &dataset does not exist.;
    %END;
%MEND CleanCommas;

يتضمن هذا الماكرو ضوابط تحقق مسبقة تتأكد من وجود الجدول في مكتبة ساس قبل الشروع في تنفيذه، ويسمح بتمرير الفواصل اللاتينية أو العربية بمرونة مطلقة، مما يوفر بيئة برمجية آمنة ومحمية تمنع انهيار خطوط الإنتاج البرمجية المؤتمتة وتدعم استدامة مشاريع البيانات المؤسسية.

12. دراسة حالة شاملة وخلاصة توصيات لمحللي البيانات والباحثين

12.1 محاكاة مشروع متكامل: من البيانات الخام إلى النمذجة الإحصائية

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

يبدأ السيناريو باستيراد ملف غير مهيكل عبر خطوة البيانات مع تحديد أطوال الحقول الصريحة، ثم تطبيق المصفوفات لتنظيف كافة الأعمدة النصية من الفواصل الإنجليزية والعربية باستخدام دالة COMPRESS المباشرة، مع حماية المسافات البينية بين الكلمات في أسماء الكيانات. بعد ذلك، يتم استخدام دالة INPUT مع محدد COMMA لتحويل قيم الإيرادات الملوثة بفواصل الآلاف إلى أرقام صالحة للتحليل الرياضي.

يختتم البرنامج خطواته بتنفيذ فحص آلي عبر دالة FIND لضمان عدم بقاء أي أثر للفواصل، ثم استخراج تقرير PROC FREQ للتحقق من سلامة التصنيفات، وتقرير PROC MEANS لإثبات ثبات الإيرادات المالية الإجمالية قبل وبعد المعالجة. يجسد هذا المسار العملي التطبيق الحقيقي لأفضل الممارسات الهندسية التي تم تفصيلها عبر فصول هذا الدليل.

12.2 جدول المقارنة الشامل لأدوات إزالة الفواصل في SAS

لتسهيل اتخاذ القرار البرمجي السريع للمحللين ومهندسي البيانات، يوضح الجدول التالي مصفوفة المقارنة الفنية الشاملة بين كافة الدوال والأدوات المتاحة في نظام ساس لإزالة الفواصل، مبيناً جوانب القوة والضعف ومستوى الملاءمة لكل أداة:

الأداة / الدالة نقاط القوة الرئيسية أبرز نقاط الضعف الاستخدام الموصى به برمجياً
COMPRESS (بمحددات) تنفيذ مباشر، سرعة قصوى، تحافظ على مسافات الكلمات تماماً تزيل الرمز أينما وجد دون تمييز سياقي الخيار الافتراضي الأول لكافة التطبيقات الحديثة
COMPRESS + TRANSLATE متوافقة مع الإصدارات التاريخية القديمة، استئصال قطعي تمسح كافة المسافات الطبيعية بين الكلمات، استدعاء مزدوج تنظيف وتوحيد الأكواد والمعرفات المتصلة فقط
TRANSLATE (منفردة) سريعة على مستوى البايت، لا تحذف الرموز عشوائياً تستبدل الفاصلة بمسافة بيضاء ولا تقلص طول السلسلة استبدال الفواصل بمسافات لفك تشابك النصوص
TRANWRD تتعامل مع المقاطع والكلمات الفرعية وليس فقط الأحرف تتطلب تحديداً صريحاً لأطوال السلاسل لمنع البتر استبدال أنماط فواصل محددة بمقاطع أو مسافات
PRXCHANGE مرونة لا نهائية، شروط سياقية معقدة، مطابقة ذكية أعلى استهلاكاً لموارد المعالج وبنية برمجية معقدة تنظيف النصوص غير المهيكلة والتطبيقات المتقدمة المشروطة

تعد هذه المصفوفة بمثابة خارطة طريق هندسية تتيح لفرق التحليل اختيار الأداة المثلى التي تحقق التوازن الدقيق بين سرعة التنفيذ ونقاء المخرجات وسلامة البيانات.

12.3 أفضل الممارسات الإرشادية لضمان سلامة البيانات النصية في ساس

في ختام هذا المرجع المعرفي الموسع، نلخص القواعد الذهبية الإرشادية التي يجب أن تحكم سلوك كل متخصص يتعامل مع البيانات النصية في بيئة ساس:

  • التحديد المسبق لأطوال المتغيرات: لا تعتمد أبداً على التقدير التلقائي لأطوال المتغيرات النصية في ساس؛ استخدم دائماً عبارة LENGTH في صدارة خطوة البيانات لحماية البيانات من البتر غير المقصود.
  • الفصل الصارم بين بيئات المعالجة: تجنب تعديل البيانات في بيئة الإنتاج مباشرة؛ قم دائماً بإنشاء بيئة اختبار معزولة واحتفظ بنسخ احتياطية من البيانات الخام ومسارات تدقيق واضحة.
  • التفريق بين أنواع الفواصل: انتبه دائماً للفرق بين الفواصل اللاتينية والعربية والعشرية، وافحص ترميز الملفات المستوردة لضمان استهداف الرموز الصحيحة.
  • اعتماد البساطة المحسنة: استخدم دالة COMPRESS(var, ‘,’) المباشرة كمعيار قياسي، وابتعد عن التراكيب القديمة أو التعابير النمطية المعقدة ما لم تكن هناك ضرورة فنية ملحة تفرضها طبيعة البيانات.
  • الأتمتة وضبط الجودة: أدمج اختبارات الفحص والتحقق الآلي (Automated Assertions) وفحوصات التكرار (PROC FREQ) ضمن خطوط أنابيب البيانات لضمان عدم مرور أي تشوهات إلى مراحل التحليل والنمذجة.

مع استمرار تطور منظومات ساس السحابية الحديثة، مثل SAS Viya، تتكامل هذه الدوال القياسية مع خوارزميات المعالجة الموزعة في الذاكرة (Cloud Analytic Services – CAS) وأدوات الذكاء الاصطناعي، مما يتيح للمؤسسات تنظيف مليارات السلاسل النصية بمرونة فائقة وسرعة غير مسبوقة، مع البقاء أوفياء للمفاهيم الهندسية التأسيسية التي استعرضناها بالتفصيل في هذا الدليل.

خاتمة

تناول هذا الدليل الشامل مسألة إزالة الفواصل من السلاسل النصية في بيئة ساس (SAS) من كافة أبعادها النظرية والمعمارية والتطبيقية. لقد تبين لنا بوضوح أن التعامل مع السلاسل الحرفية ليس مجرد إجراء كتابي عابر، بل هو عملية هندسية تتطلب فهماً عميقاً لآليات عمل محرك خطوات البيانات، ومتجه بيانات البرنامج (PDV)، وخصائص إدارة الذاكرة وتخصيص الأطوال.

بدأنا باستعراض الصيغة الكلاسيكية المركبة التي تدمج دالتي COMPRESS و TRANSLATE مبرزين أسباب نشوئها وسلوكها التشغيلي وحدودها، ثم انتقلنا إلى تفصيل الطريقة المباشرة الأحدث والأكثر فاعلية عبر دالة COMPRESS الموجهة بمحددات، والتي تضمن التخلص التام من الفواصل مع الحفاظ على المسافات الطبيعية بين الكلمات بأعلى كفاءة حوسبية ممكنة. كما حللنا دور الدوال المتقدمة كـ TRANWRD والتعابير النمطية PRX، وناقشنا السبل الهندسية لمعالجة الأرقام المخزنة كنصوص وتطهيرها عبر دوال وتنسيقات INPUT و COMMA.

إن الالتزام بالمعايير الهندسية وأفضل الممارسات البرمجية الموضحة في هذا العمل—بدءاً من إدارة حالات الحافة والترميزات المتعددة، وتوظيف المصفوفات للمعالجة المجمعة، وصولاً إلى بناء مسارات التدقيق والاختبارات الرقابية المؤتمتة—يضمن للباحثين ومحللي البيانات الحصول على بيانات نصية نقية وموثوقة بنسبة 100%، مما يدعم دقة النماذج الإحصائية ويعزز نجاح المشاريع التحليلية والمؤسسية الكبرى.

المراجع

  • Cody, R. (2018). Cody’s Data Cleaning Techniques Using SAS (3rd ed.). SAS Institute Inc. https://support.sas.com/content/dam/SAS/support/en/books/cody-data-cleaning.pdf
  • Delwiche, L. D., & Slaughter, S. J. (2019). The Little SAS Book: A Primer (6th ed.). SAS Institute Inc. https://support.sas.com/en/books/little-sas-book.html
  • Horstman, D. W. (2017). Character Wrangling: Using Character Functions in the SAS DATA Step. SAS Global Forum Proceedings. SAS Institute Inc. https://support.sas.com/resources/papers/proceedings17/0440-2017.pdf
  • SAS Institute Inc. (2021). SAS(R) 9.4 Functions and CALL Routines: Reference, Fifth Edition. SAS Institute Inc. https://documentation.sas.com/doc/en/pgmsascdc/9.4_3.5/lefunctionsref/titlepage.htm
  • SAS Institute Inc. (2022). SAS(R) Viya(R) Programming Documentation: Data Step Basics. SAS Institute Inc. https://documentation.sas.com/doc/en/pgmsascdc/v_035/lestmtsref/titlepage.htm
  • Unicode Consortium. (2023). The Unicode Standard, Version 15.0. Unicode Consortium. https://www.unicode.org/versions/Unicode15.0.0/

تقييم هذا المحتوى

0.0 / 5 0 تقييمات

اقتباس هذا المقال

looti, M. (2026, سبتمبر 11). ساس: كيفية إزالة الفواصل من السلسلة النصية. عرب سايكلوجي. https://arabpsychology.com/statistics/sas-how-to-remove-commas-from-string/
looti, Mohammed. “ساس: كيفية إزالة الفواصل من السلسلة النصية.” عرب سايكلوجي, 11 سبتمبر 2026, https://arabpsychology.com/statistics/sas-how-to-remove-commas-from-string/.
looti, Mohammed. “ساس: كيفية إزالة الفواصل من السلسلة النصية.” عرب سايكلوجي. سبتمبر 11, 2026. https://arabpsychology.com/statistics/sas-how-to-remove-commas-from-string/.