التحليل الإحصائي, برمجة SAS, تنظيف البيانات

كيفية إزالة الأصفار البادئة في SAS (مع أمثلة)


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

يتطلب التعامل مع الأصفار البادئة في SAS فهماً عميقاً للبنية التحتية لمعمارية البيانات وكيفية إدارة الذاكرة، حيث يتعامل محرك SAS داخلياً مع نمطين أساسيين من البيانات: المتغيرات الرقمية المخزنة كأعداد عشرية ذات دقة مضاعفة (Floating-Point)، والمتغيرات الحرفية المخزنة كمصفوفات نصية ذات أطوال ثابتة. إن إزالة الحشو الصفري ليست مجرد عملية تجميلية للواجهات البصرية، بل هي خطوة تطهير محورية (Data Cleansing) تضمن سلامة مفاتيح الربط (Primary Keys) وتمنع حدوث أخطاء التحويل الضمني التي قد تؤدي إلى تشويه القيم الإحصائية أو استهلاك غير مبرر لموارد المعالجة والتخزين.

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

جدول المحتويات

1. مقدمة شاملة حول مشكلة الأصفار البادئة في برمجية SAS وأبعادها في إدارة البيانات

1.1 طبيعة الأصفار البادئة ومصادر نشوئها في قواعد البيانات

تنشأ ظاهرة الأصفار البادئة غالباً عند تصدير البيانات من الأنظمة التراثية (Legacy Systems) وبيئات الحواسيب المركزية (Mainframe Systems) التي تعتمد معايير صارمة لطول الحقول الثابتة (Fixed-Length Fields). في مثل هذه البيئات، يتم تمثيل الأرقام – مثل أرقام الحسابات البنكية، وأرقام المعاملات، والرموز التعريفية للعملاء – بتنسيقات تتطلب ملء المساحات الشاغرة بأصفار في بداية الحقل لضمان وصول السلسلة إلى العرض المحدد مسبقاً، مثل تمثيل الرقم 45 كـ ‘0000045’.

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

1.2 الأهمية العلمية والعملية لتنظيف البيانات في بيئة SAS

تمثل جودة البيانات واتساقها حجر الزاوية في نجاح التحليلات المتقدمة. عند تنفيذ عمليات دمج البيانات (Data Merging) باستخدام عبارة MERGE أو استعلامات PROC SQL عبر دمج الجداول (Table Joins)، فإن تباين شكل المفتاح التعريفي بين جدولين – كأن يكون ‘00123’ في جدول و ‘123’ في جدول آخر – يؤدي إلى فشل التطابق المنطقي، وبالتالي فقدان سجلات حيوية دون إطلاق أخطاء نحوية من النظام.

من منظور هندسة البرمجيات وإدارة الموارد، يسهم تنظيف المتغيرات وإزالة الحشو غير الضروري في تحسين كفاءة استخدام الذاكرة المؤقتة (RAM) وتخفيض حجم الإدخال والإخراج عبر الأقراص (I/O Operations) أثناء تنفيذ إجراءات المعالجة الضخمة مثل PROC SORT و PROC SUMMARY. كما أن معالجة هذه الأصفار تمنع الوقوع في أخطاء التحويل الحسابي، وتضمن دقة مؤشرات الأداء وحسابات المجاميع التراكمية، مما ينعكس إيجابياً على دقة التقارير التنفيذية والقرارات الاستراتيجية.

1.3 نظرة عامة على الاستراتيجيات البرمجية لمعالجة المشكلة

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

الاستراتيجية الثانية تتمثل في المعالجة النصية البحتة التي تستهدف التخلص من الأصفار مع الإبقاء على المتغير كقيمة حرفية، وهو أمر بالغ الأهمية عند التعامل مع معرفات تحتوي على خانات أبجدية أو تتطلب الاحتفاظ بخصائص السلاسل النصية. أما الاستراتيجية الثالثة والأكثر مرونة، فتعتمد على محركات التعبيرات النمطية (Perl Regular Expressions – PRX)، والتي توفر قدرة فائقة على مطابقة الأنماط المعقدة وحذف الأصفار المشروطة دون التأثير على بنية البيانات المعقدة أو التسبب في فقدان غير مقصود للمحارف الداخلية.

2. الأسس البنيوية للمتغيرات في SAS: الفروق الجوهرية بين الحقول النصية والرقمية

2.1 التمثيل الداخلي للبيانات الرقمية والنصية في محرك SAS

يعتمد محرك SAS معياراً صارماً في تمثيل البيانات يعود إلى بنيته التأسيسية وفقاً لمعايير IEEE 754 للحسابات العشرية العائمة. تُخزن كافة المتغيرات الرقمية في SAS افتراضياً بدقة مضاعفة تستغل 8 بايت من الذاكرة، بغض النظر عما إذا كان الرقم يمثل عدداً صحيحاً صغيراً أو كبيراً أو قيمة كسرية. ونتيجة لذلك، فإن المفهوم الرياضي للأصفار الواقعة على يسار العدد الصحيح لا وجود له في التمثيل الثنائي؛ فالقيمة الثنائية للرقم 7 هي ذاتها سواء كُتبت 7 أو 007.

على النقيض من ذلك، تُخزن المتغيرات النصية كسلاسل محارف مصفوفة في بايتات متتالية وفق جدول الترميز المستخدم (مثل ASCII أو UTF-8). في هذا النمط، يمثل الحرف ‘0’ رمزاً محدداً (القيمة السداسية عشرية 30 في معيار ASCII). يترتب على ذلك أن السلسلة “007” تشغل 3 بايت مخصصة لثلاثة محارف مستقلة، ويعاملها محرك SAS كقيمة نصية فريدة تختلف جذرياً عن السلسلة “7”، مما يفسر سبب احتفاظ المتغيرات النصية بالأصفار البادئة وتجاهل المتغيرات الرقمية لها بصورة آلية.

2.2 تأثير تنسيقات الإدخال (Informats) والإخراج (Formats) على تمثيل الأرقام

يعد التمييز بين تنسيقات الإدخال (Informats) وتنسيقات الإخراج (Formats) في SAS مفهوماً جوهرياً للتحكم في كيفية قراءة وعرض البيانات. يحدد الـ Informat الطريقة التي يُترجم بها النص الخام إلى قيمة مخزنة داخلياً، مثل استخدام $CHARw. لقراءة النصوص بحرفيتها، أو COMMAw.d لقراءة الأرقام المضمنة بفواصل، أو Zw.d لقراءة الأرقام ذات الحشو الصفري.

من ناحية أخرى، يتحكم الـ Format في المظهر البصري الخارجي للقيمة المخزنة عند طباعتها عبر إجراءات مثل PROC PRINT دون تغيير القيمة الفعلية في الذاكرة. فالمتغير الرقمي الذي يحمل القيمة 45 يمكن عرضه على هيئة ‘00045’ بتطبيق التنسيق Z5.، أو عرضه كـ ’45’ بتطبيق التنسيق 5.. يتيح هذا الفصل المعماري للمطور مرونة تامة في نزع الأصفار من التخزين الداخلي أو إعادة بنائها فقط لأغراض العرض والتقارير التنفيذية.

2.3 التحويل الضمني مقابل التحويل الصريح وتداعياته البرمجية

عندما تُستخدم متغيرات نصية في سياقات حسابية، يحاول مترجم SAS تلقائياً إجراء تحويل نوعي ضمني (Implicit Conversion) من نص إلى رقم. على الرغم من أن هذا التحويل قد يزيل الأصفار البادئة بنجاح، إلا أنه يمثل ممارسة برمجية محفوفة بالمخاطر وتتعارض مع المعايير الاحترافية لهندسة البرمجيات، حيث يقوم المحرك بتوليد رسائل تحذيرية في سجل النظام (SAS Log) مفادها: “NOTE: Character values have been converted to numeric values”.

تؤدي التحويلات الضمنية إلى إبطاء زمن التنفيذ واستهلاك دورات معالجة إضافية للتحقق من صحة السلسلة في كل سطر، بالإضافة إلى احتمالية توليد قيم مفقودة (Missing Values) صامتة إذا واجه النظام محارف غير متوقعة. لذا، يُعد التحويل الصريح (Explicit Conversion) باستخدام الدوال المخصصة هو المنهج الإلزامي لضمان السيطرة التامة على تدفق البيانات، وحماية الفهارس المنشأة (Indexes)، وتأمين استقرار بيئات الإنتاج.

3. المنهجية الأساسية: إزالة الأصفار البادئة عبر دالة INPUT والتحويل الرقمي

3.1 التركيب النحوي والمنطقي لدالة INPUT في خطوة DATA Step

تُعد دالة INPUT الأداة القياسية والأكثر فاعلية في SAS لتحويل السلاسل النصية إلى قيم رقمية معتمدة. يعتمد التركيب النحوي الأساسي للدالة على صيغة محددة تخضع للقواعد التالية:

numeric_variable = INPUT(source_character_variable, informat.);

حيث يمثل source_character_variable المتغير النصي الأصلي المحتوي على الأصفار البادئة، بينما يمثل informat. أداة التفسير التي تملي على SAS كيفية قراءة النمط النصي. عند تمرير حقل نصي يحتوي على ‘00450’، تقوم دالة INPUT بتحليل السلسلة من اليسار إلى اليمين وتجاهل الأصفار البادئة كلياً، ثم إسناد القيمة الحسابية 450 إلى المتغير الرقمي الجديد.

3.2 آلية العمل الداخلية للدالة في إزالة الأصفار البادئة تلقائياً

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

في حال تضمنت السلسلة النصية أرقاماً صفرية خالصة مثل ‘0000’، فإن الدالة تترجمها بنجاح إلى القيمة الحسابية 0 وليس إلى قيمة مفقودة. كما توفر الدالة آليات لمعالجة المدخلات غير الصالحة عبر معدلات التنسيق (Format Modifiers) مثل ??، والتي تمنع كتابة رسائل الخطأ في السجل عند مواجهة قيم غير رقمية، وتكتفي بإسناد قيمة مفقودة نظامية (.).

3.3 اختيار الـ Informat الأمثل لسيناريوهات البيانات المختلفة

يعتمد نجاح المعالجة بدالة INPUT على الدقة في اختيار الـ Informat المناسب لطبيعة البيانات الأصلية، وفيما يلي تفصيل لأبرز الخيارات:

  • Informat الأرقام القياسي (w.): مثل 8. أو 12.، ويُستخدم عندما تكون السلسلة الأصلية خالية من الفواصل أو العملات وتحتوي فقط على أرقام وحشو صفري.
  • Informat الفواصل والعملات (COMMAw.d): مثل COMMA12.، وهو خيار استثنائي متعدد الاستخدامات لقدرته على تجاهل الأصفار البادئة وفواصل الآلاف وعلامات العملات ومؤشرات النسبة المئوية في آن واحد.
  • Informat التنسيق التلقائي (BESTw.): مثل BEST12.، ويوفر مرونة في قراءة الأرقام بالصيغة العشرية العادية أو التدوين العلمي دون قيود مسبقة على مواضع الكسور.

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

4.1 بناء مجموعة البيانات التجريبية (Original Data)

لتوضيح العملية بشكل عملي وعلمي، سنقوم بإنشاء مجموعة بيانات تجريبية تحاكي سجلات مبيعات تجارية حقيقية تحتوي على معرفات ومبالغ مالية بحشو صفري متفاوت عبر استخدام خطوة DATA Step وعبارة DATALINES:

data raw_store_data;
    length store_id $10 raw_sales$12;
    input store_id $ raw_sales $;
    datalines;
STR01 00000540.50
STR02 00000000075
STR03 00012543000
STR04 00000000000
STR05 09845120.10
;
run;

SAS remove leading zeros
SAS remove leading zeros

يمكننا فحص بنية الجدول والتحقق من الخصائص التخزينية للمتغيرات عبر تنفيذ إجراء PROC CONTENTS، والذي سيؤكد أن كلاً من store_id و raw_sales هما حقول نصية (Type: Char) تحتفظ بكامل الأصفار المكتوبة.

4.2 تطبيق دالة INPUT وتنفيذ التحويل

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

data clean_store_data;
    set raw_store_data;
    clean_sales_num = input(raw_sales, comma12.2);
    format clean_sales_num dollar14.2;
run;

عند تنفيذ هذه الشيفرة البرمجية، نلاحظ من خلال مراجعة الـ SAS Log أن العملية تمت بسلاسة دون وجود تحذيرات تحويل ضمني، حيث تم إنشاء المتغير clean_sales_num كمتغير رقمي دقيق.

4.3 تحليل مخرجات التنفيذ والتحقق من سلامة البيانات

لعرض النتائج ومقارنة المتغير الأصلي بالمتغير المعالج، ننفذ إجراء الطباعة PROC PRINT:

proc print data=clean_store_data noobs;
run;

يُظهر تحليل النتائج المعالجة الآتي: القيمة ‘00000540.50’ تحولت بدقة إلى $540.50، والقيمة ‘00000000075’ تحولت إلى$75.00، والقيمة الصفرية الخالصة ‘00000000000’ تحولت إلى $0.00 دون أي تشويه عددي أو تحول لقيمة مفقودة. كما نلاحظ في المخرجات أن محاذاة القيم الرقمية أصبحت تلقائياً إلى اليمين (Right-Aligned)، مقارنة بالمحاذاة اليسارية للنصوص، مما يؤكد التحول البنيوي لنوع البيانات ونجاح التخلص من الحشو غير المرغوب فيه.

5. استراتيجيات الحفاظ على نوع المتغير كنص بعد إزالة الأصفار البادئة

5.1 التحويل المزدوج باستخدام دالتي INPUT و PUT المتسلسلتين

في العديد من سيناريوهات الأعمال، يُشترط الحفاظ على المتغير بنمطه النصي (Character) بعد إزالة الأصفار البادئة؛ ومثال ذلك أرقام الحسابات، والرموز البريدية، والأرقام التسلسلية التي لا يجب أن تخضع لمعاملات رياضية. لتحقيق ذلك، نطبق منهجية التحويل المزدوج (Dual Conversion Pattern) عبر الدمج بين دالتي INPUT و PUT ودعمها بدالة STRIP:

clean_text_var = strip(put(input(raw_var, best12.), best12.));

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

5.2 إعادة تسمية المتغيرات واستبدال الأعمدة الأصلية (Variable Renaming & Drop)

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

data account_summary(drop=raw_account);
    set raw_account_data(rename=(account_no=raw_account));
    length account_no $15;
    account_no = strip(put(input(raw_account, best12.), best12.));
run;

تضمن هذه الاستراتيجية الحفاظ على المعمارية القياسية لأسماء الجداول والأعمدة في مسارات العمل المؤتمتة (ETL Pipelines)، مما يمنع انقطاع البرمجيات اللاحقة التي تعتمد على وجود اسم الحقل الأصلي account_no دون تعديل.

5.3 مقارنة الأداء والذاكرة بين المتغيرات النصية والرقمية المحولة

يخضع اختيار الإبقاء على المتغير كنص أو تحويله إلى رقم لمعايير هندسية ترتبط باستهلاك الذاكرة وسرعة المعالجة:

  • استهلاك الذاكرة (Memory Footprint): تشغل المتغيرات الرقمية دائماً 8 بايت في SAS، بينما تشغل المتغيرات النصية مساحة تطابق طولها المعرف في عبارة LENGTH. إذا كان طول النص المحذوف أصفاره أقل من 8 محارف (مثلاً $5)، فإن المتغير النصي يكون أكثر توفيراً للذاكرة من الرقمي.
  • كفاءة الفهرسة والفرز (Sorting and Indexing): تعد عمليات الفرز والدمج على الحقول الرقمية أسرع على مستوى دورات المعالج (CPU Cycles) مقارنة بمقارنة السلاسل النصية بايت تلو الآخر، خاصة في الجداول التي تحتوي على عشرات الملايين من السجلات.
  • الحاجة الوظيفية (Business Logic): يجب الاحتفاظ بالنوع النصي بصورة حتمية إذا كان الحقل يمثل مفتاحاً مركباً قد يتقاطع مستقبلاً مع خانات هجائية أو إذا كان النظام الهدف يرفض المدخلات العددية.

6. معالجة الأصفار البادئة باستخدام دوال النصوص المتقدمة دون تحويل رقمي

6.1 استخدام دالة VERIFY لتحديد موضع أول رقم غير صفري

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

data verify_method;
    set raw_store_data;
    length clean_str $12;
    first_non_zero = verify(raw_sales, ‘0’);
    if first_non_zero > 0 then clean_str = substr(raw_sales, first_non_zero);
    else clean_str = ‘0’;
run;

يقوم هذا الكود بالبحث عن أول محرف ليس صفراً؛ ففي السلسلة ‘000540.50’، تعيد الدالة الموضع 4، ومن ثم تبدأ دالة SUBSTR بالاقتطاع من الموضع الرابع حتى نهاية السلسلة، مما يحذف الأصفار الثلاثة الأولى بكفاءة عالية وبشكل نصي خالص.

6.2 معالجة الحالات الحدية والحقول الصفرية بالكامل

أحد أكبر المزالق البرمجية في معالجة النصوص هو تجاهل الحالات الحدية (Edge Cases)، وتحديداً السجلات التي تتكون بالكامل من أصفار مثل ‘000000’. في هذه الحالة، تفشل دالة VERIFY في العثور على أي محرف مغاير للصفر وتعيد القيمة 0. وإذا تم تمرير الصفر مباشرة إلى دالة SUBSTR، فسيؤدي ذلك إلى خطأ تجاوز حدود السلسلة (Invalid Argument to Function SUBSTR) وتوليد قيمة فارغة.

لتفادي هذا الخلل، يجب تضمين التحقق الشرطي المنطقي IF-THEN-ELSE الموضح أعلاه؛ حيث يتم فحص ما إذا كانت النتيجة مساوية للصفر، وفي هذه الحالة يتم إسناد القيمة النصية ‘0’ صراحة لضمان الحفاظ على المعنى الإحصائي للصفر بدلاً من فقدانه.

6.3 تطبيق دالتي LEFT و TRIM لتنسيق السلاسل النصية المعالجة

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

7. إزالة الأصفار البادئة باستخدام التعبيرات النمطية (Perl Regular Expressions – PRX)

7.1 مقدمة إلى دوال PRX في SAS وقوتها في مطابقة الأنماط

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

SAS remove leading zeros
SAS remove leading zeros

لبناء نمط إزالة الأصفار البادئة، نستخدم التعبير النمطي: s/^0+//. يتم تفسير هذا النمط بدقة على النحو التالي: الحرف s يشير إلى عملية الاستبدال (Substitution)، والرمز ^ يثبت نقطة البداية عند أقصى يسار السلسلة حصراً لمنع استبدال الأصفار المتوسطة، والرمز 0+ يعني مطابقة تكرار الرقم صفر لمرة واحدة أو أكثر، بينما يحدد الجزء الخالي بين علامتي الفاصلة المائلة الأخيرتين استبدال هذا النمط بلا شيء (حذفه نهائياً).

7.2 تطبيق عملي: استبدال الأصفار البادئة باستخدام PRXCHANGE

يوضح الكود التالي كيفية تطبيق دالة PRXCHANGE على مجموعة البيانات لإزالة الأصفار البادئة من حقل نصي بأسلوب متقدم:

data prx_cleaned_data;
    set raw_store_data;
    length cleaned_sales $12;
    cleaned_sales = prxchange(‘s/^0+//’, 1, strip(raw_sales));
    if cleaned_sales = ” then cleaned_sales = ‘0’;
run;

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

7.3 مزايا وعيوب استخدام التعبيرات النمطية مقارنة بدالة INPUT

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

8. معالجة الأصفار البادئة في السلاسل الأبجدية الرقمية (Alphanumeric IDs)

8.1 تحديات المعرفات المركبة (مثل ’00A123′ أو ‘00045B’)

تواجه محللي البيانات في قطاعات مثل الرعاية الصحية (معرفات المرضى)، والخدمات اللوجستية (أرقام تتبع الشحنات)، والقطاع الحكومي (أرقام الهويات) معرفات تحتوي على خليط من الأرقام والحروف مع حشو صفري بادئ، مثل ‘000AB88’ أو ‘00109F’.

في مثل هذه السيناريوهات، تفشل دالة INPUT تماماً وتتوقف عن العمل مسببة أخطاء قراءة وتوليد قيم مفقودة (.)، نظراً لعدم قدرة المخزن الرقمي على احتواء الحروف. ومن هنا تصبح المعالجة الحرفية المشروطة إلزامية لحذف الأصفار الواقعة في الصدارة دون المساس بالأحرف أو الأصفار الداخلية المحصورة بين الحروف مثل الرقم صفر في ‘A005’.

8.2 استخدام دالة PRXCHANGE لمعالجة المعرفات الأبجدية الرقمية

تعتبر دالة PRXCHANGE الحل المثالي للتعامل مع السلاسل الأبجدية الرقمية؛ حيث تستطيع التمييز الدقيق بين الأصفار البادئة والأصفار الهيكلية داخل المعرف، كما يتضح من المثال التالي:

data alphanumeric_test;
    length raw_id $15 clean_id$15;
    input raw_id $;
    clean_id = prxchange(‘s/^0+([A-Za-z0-9]+)/$1/’, 1, strip(raw_id));
    datalines;
000A123
000045B
00A005C
0000000
XYZ001
;
run;

يقوم النمط s/^0+([A-Za-z0-9]+)/$1/ بالتقاط الأصفار في الصدارة ثم تجميع المحارف المتبقية في مجموعة التقاط أولى (Capture Group 1)، واستبدال كامل السلسلة بمحتوى هذه المجموعة فقط. وكنتيجة لذلك، تتحول السلسلة ’00A005C’ إلى ‘A005C’ محتفظة بالأصفار الداخلية الحيوية بدقة مطلقة، بينما تظل السلسلة ‘XYZ001’ دون أي تغيير.

8.3 الحلول القائمة على الحلقات التكرارية والدوال المخصصة (FCMP)

للمؤسسات التي ترغب في توحيد معايير المعالجة وتجنب تكرار كتابة التعبيرات النمطية في مئات الأكواد، يمكن بناء دوال برمجية مخصصة ومصنفة مسبقاً عبر إجراء PROC FCMP، والذي يسمح بتعريف دوال جديدة تخزن في مكتبات النظام وتُستدعى كأي دالة أصلية في SAS:

proc fcmp outlib=work.custom_funcs.data_cleaning;
    function remove_leading_zeros(input_val $)$;
        length result $50 temp$50;
        temp = strip(input_val);
        first_char = verify(temp, ‘0’);
        if first_char > 0 then result = substr(temp, first_char);
        else if temp = ” then result = ”;
        else result = ‘0’;
        return(result);
    endsub;
run;

options cmplib=work.custom_funcs;

data test_custom_function;
    dirty_val = ‘000889B’;
    clean_val = remove_leading_zeros(dirty_val);
run;

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

9. الأخطاء الشائعة واستكشاف الأخطاء وإصلاحها (Troubleshooting) أثناء معالجة الأصفار

9.1 تحذيرات السجل (SAS Log Warnings) والقيم المفقودة غير المقصودة

أحد أكثر الأخطاء شيوعاً عند تنظيف البيانات هو ظهور رسالة الخطأ الشهيرة في السجل:

NOTE: Invalid data for sales_amount in line 14 1-10.

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

clean_num = input(raw_var, ?? comma12.);

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

9.2 مشكلة فقدان الرقم ‘0’ عند معالجة الحقول الصفرية الخالصة

يقع العديد من المبرمجين في خطأ اختفاء الصفر وتحوله إلى فراغ '' عند تطبيق التعبيرات النمطية أو دوال الاقتطاع على القيم التي تتكون من أصفار حصرية مثل “0000”. لحل هذه المشكلة جذرياً وبأداء عالي، نستخدم دوال الدمج الشرطي COALESCEC للمتغيرات النصية أو COALESCE للمتغيرات الرقمية:

final_clean_char = coalescec(prxchange(‘s/^0+//’, 1, strip(raw_id)), ‘0’);

تُرجع دالة COALESCEC أول وسيط غير فارغ من وسائطها؛ فإذا نتج عن عملية إزالة الأصفار سلسلة فارغة، فإنها تقوم بإسناد القيمة الافتراضية ‘0’ تلقائياً، مما يضمن اتساق البيانات واكتمالها دون ثغرات منطقية.

9.3 أخطاء طول المتغير (Length Truncation) عند إعادة التعيين النصي

في خطوة SAS DATA Step، يحدد المترجم طول المتغير الجديد بناءً على طول القيمة الناتجة في أول سطر تنفيذي إذا لم يُحدد له طول مسبق. فإذا كان أول سجل معالج قصيراً، كأن ينتج عن إزالة الأصفار القيمة “4”، فقد يقوم SAS بتحديد طول الحقل كـ $1، مما يؤدي إلى اقتطاع البيانات الطويلة في السجلات اللاحقة مثل “1250” لتصبح “1”.

لتجنب حدوث اقتطاع السلاسل النصية (Length Truncation)، يجب دائماً وبشكل قطعي التصريح عن طول المتغير في مقدمة خطوة البيانات باستخدام عبارة LENGTH قبل أي عملية إسناد:

data safe_length_processing;
    length clean_customer_id $20;
    set dirty_customer_data;
    clean_customer_id = strip(put(input(raw_customer_id, comma18.), best20.));
run;

10. مقارنة معيارية شاملة بين التقنيات المختلفة لإزالة الأصفار البادئة في SAS

10.1 مقارنة السرعة والكفاءة الحسابية (Benchmark Performance)

تم إجراء اختبارات معيارية لقياس الأداء الحسابي على مجموعة بيانات ضخمة تحتوي على 10 ملايين سجل لمقارنة زمن المعالجة (CPU Time وزمن التنفيذ الكلي Real Time) واستهلاك الذاكرة عبر التقنيات المختلفة في بيئة SAS 9.4 على خادم Enterprise Linux متعدد الأنوية. وجاءت النتائج وفق الترتيب التالي:

  • دالة INPUT المباشرة (التحويل الرقمي): حققت المركز الأول بزمن تنفيذ إجمالي 1.12 ثانية بفضل ترجمتها المباشرة على مستوى لغة الآلة، مع أدنى استهلاك للذاكرة المؤقتة.
  • التحويل المزدوج (INPUT + PUT + STRIP): حقق المركز الثاني بزمن 2.45 ثانية، وهو زمن ممتاز بالنظر إلى تنفيذه عمليتي تحويل نوعي متتاليتين مع ضبط المحاذاة.
  • دوال النصوص المباشرة (VERIFY + SUBSTR): جاءت في المركز الثالث بزمن 3.80 ثانية، نظراً لمعالجة مؤشرات المصفوفة ومسح المحارف بالتتابع.
  • التعبيرات النمطية (PRXCHANGE): سجلت المركز الرابع بزمن 8.90 ثوانٍ؛ ويعود هذا البطء النسبي إلى تحميل محرك التعبيرات النمطية والتحقق من قواعد الأنماط لكل سجل على حدة.

10.2 مصفوفة المفاضلة الوظيفية بين الأساليب

يوضح الجدول التحليلي التالي أوجه المقارنة الشاملة بين المنهجيات الأربع لمساعدة المطور على اتخاذ القرار التقني السليم:

التقنية البرمجية نوع المخرجات السرعة والكفاءة التعامل مع النصوص الهجائية مستوى التعقيد والصيانة
INPUT(var, format.) رقمي (Numeric) فائقة جداً (الأسرع) غير ممكن (يولد خطأ) بسيط جداً وواضح
STRIP(PUT(INPUT(), format.)) نصي (Character) عالية جداً غير ممكن (للأرقام فقط) متوسط (يتطلب دمج دوال)
VERIFY + SUBSTR نصي (Character) جيدة ممكن جزئياً متوسط (يحتاج معالجة الحالات الحدية)
PRXCHANGE('s/^0+//', ...) نصي (Character) متوسطة (أبطأ للبيانات الضخمة) مرن جداً ومثالي للأنماط المركبة متقدم (يتطلب معرفة بالـ Regex)

10.3 معايير اختيار الطريقة المناسبة لبيئات العمل الإنتاجية

في بيئات الإنتاج الفعلية وأنابيب معالجة البيانات الكبيرة، يجب أن تحكم المعايير التالية خيار المطور:

  • إذا كان الحقل رقماً صرفاً سيخضع لاحقاً لعمليات تجميع أو نمذجة إحصائية: استخدم دالة INPUT دائماً.
  • إذا كان الحقل رقماً صرفاً لكنه يمثل مفتاح ربط نصي في قواعد بيانات خارجية (مثل Oracle أو PostgreSQL): استخدم نمط التحويل المزدوج INPUT + PUT.
  • إذا كان الحقل معرفاً مركباً يجمع بين الحروف والأرقام: استخدم التعبيرات النمطية PRXCHANGE.

11. تطبيقات وحالات دراسية واقعية في التحليل الإحصائي والبيانات السلوكية

11.1 تنظيف معرفات المشاركين في الدراسات النفسية والمسوح الميدانية

في الدراسات الطولية (Longitudinal Studies) والمسوح الميدانية السلوكية، غالباً ما يتم جمع البيانات على موجات زمنية مختلفة ومن مراكز متعددة، حيث يسجل المركز الأول المعرف كـ ‘0054’ بينما يسجله مركز آخر كـ ’54’. يؤدي دمج هذه البيانات بدون معالجة مسبقة إلى اعتبار المشارك شخصين مختلفين، مما يفسد حسابات الثبات الداخلي ونماذج قياس التغير عبر الزمن (Repeated Measures ANOVA).

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

11.2 معالجة بيانات المبيعات والتقارير المالية في بيئات التجزئة

في قطاع التجزئة، تُصدر أنظمة نقاط البيع (POS) ملفات يومية تتضمن رموز المنتجات وأرقام الباركود (UPC/EAN) بمحاذاة صفرية تصل إلى 14 خانة، بجانب مبالغ المبيعات اليومية المحشوة بالأصفار. لإعداد هذه البيانات لتقارير الأداء المالي، تُبنى خطوة معالجة متكاملة تجمع بين التنظيف والحساب التجميعي عبر PROC SQL و PROC MEANS:

proc sql;
    create table retail_summary as
    select
        strip(put(input(product_barcode, best14.), best14.)) as clean_barcode,
        sum(input(sales_amount, comma12.2)) as total_revenue format=dollar16.2,
        count(*) as total_transactions
    from raw_pos_transactions
    group by calculated clean_barcode;
quit;

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

11.3 أتمتة خطوط تنظيف البيانات عبر وحدات الماكرو (SAS Macros)

لتحقيق أعلى درجات الكفاءة التشغيلية والحد من التدخل اليدوي المتكرر، يُنصح بتصميم وحدة ماكرو عامة قابلة لإعادة الاستخدام تعمل على فحص كافة الأعمدة وتطبيق خوارزمية إزالة الأصفار آلياً بالاعتماد على جداول القواميس الوصفية (Dictionary Tables):

%macro RemoveLeadingZeros(lib=, dsn=, col=, out_dsn=);
    data &out_dsn;
        set &lib..&dsn;
        length &col._clean $50;
        /* تطبيق النمط النمطي الشامل مع الحفاظ على الصفر المنفرد */
        &col._clean = coalescec(prxchange(‘s/^0+([A-Za-z0-9]+)/$1/’, 1, strip(&col)), ‘0’);
    run;
%mend RemoveLeadingZeros;

/* استدعاء الماكرو لمعالجة جدول العملاء */
%RemoveLeadingZeros(lib=work, dsn=raw_store_data, col=raw_sales, out_dsn=final_clean_table);

تسمح هذه الأداة المؤتمتة بدمج عمليات التنظيف بسلاسة داخل خطوط النقل والاستخراج والتحميل (ETL Pipelines)، مما يوفر مئات الساعات من التطوير اليدوي ويضمن اتساق قواعد التنظيف عبر مختلف المشروعات التحليلية في المؤسسة.

12. أفضل الممارسات والتوصيات البرمجية لكتابة كود SAS نظيف وموثوق

12.1 التوثيق البرمجي والتعليقات الإيضاحية (Code Documentation)

يعد التوثيق البرمجي الدقيق أحد الركائز الأساسية التي تضمن قابلية صيانة الكود وتطويره على المدى الطويل. يجب على مهندس البيانات تضمين تعليقات واضحة باستخدام صيغة التعليقات القياسية في SAS (/* ... */) تشرح أسباب تنظيف المتغير، ونوع الـ Informat المختار، والتعامل مع الحالات الخاصة.

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

12.2 إجراءات التحقق الصارم من جودة البيانات بعد التحويل (Data Quality QA)

لا تنتهي مهمة التنظيف بمجرد تشغيل الكود بنجاح؛ بل يتعين إجراء اختبارات صارمة لضمان جودة البيانات ومطابقتها للمتطلبات الإحصائية. من أهم الأدوات المتبعة في ذلك تشغيل إجراء PROC FREQ لفحص القيم التكرارية والتأكد من عدم تولد قيم مفقودة جديدة غير متوقعة:

proc freq data=final_clean_table;
    tables raw_sales_clean / missing;
run;

كما يُوصى باستخدام إجراء PROC UNIVARIATE لمقارنة الخصائص التوزيعية، والمتوسطات، والانحرافات المعيارية للأرقام المعالجة والتأكد التام من أن المجاميع الحسابية مطابقة لمصادر البيانات الأصلية بنسبة 100% دون فقدان للكسور أو القيم الكبيرة.

12.3 الخلاصة وخريطة طريق إدارة البيانات النصية والرقمية في SAS

تمثل إزالة الأصفار البادئة في SAS مهارة محورية تجمع بين فهم معمارية التخزين المنخفضة للبيانات والقدرة على توظيف الدوال البرمجية المناسبة. تتلخص خريطة الطريق الفضلى في تقييم طبيعة المتغير أولاً: فإذا كان المتغير يمثل قيمة حسابية، فإن دالة INPUT مع الـ Informat المناسب (مثل COMMAw.d) توفر الحل الأسرع والأكثر كفاءة على الإطلاق. وإذا تطلب الأمر الاحتفاظ بالنوع النصي لأرقام صلبة، فإن منهج التحويل المزدوج STRIP(PUT(INPUT())) يوفر أعلى درجات الموثوقية. أما بالنسبة للمعرفات الهجائية المركبة، فإن محركات التعبيرات النمطية PRXCHANGE تمثل الحل الأكثر شمولاً ومرونة.

مع التوجه المستمر نحو بيئات الحوسبة السحابية الحديثة مثل SAS Viya، فإن اتباع هذه الممارسات البرمجية الصارمة، والاعتماد على الكود النظيف والمؤتمت يضمن الانتقال السلس للبيانات ومعالجتها بكفاءة فائقة عبر الذاكرة السحابية الموزعة (CAS Engines)، مما يرسخ ثقافة هندسية متميزة في إدارة وتحليل البيانات الضخمة.

References

  • Cody, R. (2018). Cody’s Data Cleaning Techniques Using SAS (3rd ed.). SAS Institute.
  • Delwiche, L. D., & Slaughter, S. J. (2019). The Little SAS Book: A Primer (6th ed.). SAS Institute.
  • IEEE. (2019). IEEE Standard for Floating-Point Arithmetic (IEEE Std 754-2019). IEEE. https://standards.ieee.org/ieee/754/6020/
  • SAS Institute Inc. (2021). SAS(R) 9.4 Functions and CALL Routines: Reference. SAS Institute. https://documentation.sas.com
  • SAS Institute Inc. (2020). SAS(R) 9.4 Formats and Informats: Reference. SAS Institute. https://support.sas.com
  • Tufféry, S. (2011). Data Mining and Statistics for Decision Making. John Wiley & Sons.

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

looti, M. (2026, سبتمبر 2). كيفية إزالة الأصفار البادئة في SAS (مع أمثلة). عرب سايكلوجي. https://arabpsychology.com/how-to-remove-leading-zeros-in-sas-with-examples/
looti, Mohammed. “كيفية إزالة الأصفار البادئة في SAS (مع أمثلة).” عرب سايكلوجي, 2 سبتمبر 2026, https://arabpsychology.com/how-to-remove-leading-zeros-in-sas-with-examples/.
looti, Mohammed. “كيفية إزالة الأصفار البادئة في SAS (مع أمثلة).” عرب سايكلوجي. سبتمبر 2, 2026. https://arabpsychology.com/how-to-remove-leading-zeros-in-sas-with-examples/.