إدارة البيانات الإحصائيةبرمجة SAS

SAS: كيفية استخدام عبارة Datalines لإنشاء مجموعة بيانات

دليل أكاديمي شامل يشرح كيفية استخدام عبارة Datalines في لغة SAS لإنشاء مجموعات البيانات من الصفر، مع تفصيل القواعد النحوية، الأنماط، وأفضل الممارسات البرمجية.

تاريخ النشر

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

تُمثّل عبارة Datalines في لغة ساس الركيزة المحورية لتحقيق هذا الإدخال المباشر؛ إذ تُمكّن محلل البيانات من كتابة الأسطر البيانية وتمريرها فورياً إلى مجمّع ومفسر ساس، مما يمنحه مرونة فائقة وسرعة تشغيلية عالية أثناء مرحلة بناء النماذج الأولية (Prototyping)، والتحقق من صحة الفرضيات الخوارزمية، واختبار الدوال الحسابية المخصصة. إن فهم الآليات الداخلية لعبارة Datalines لا يقتصر على حفظ القواعد التركيبية البسيطة، بل يتطلب استيعاباً عميقاً لدورة حياة خطوة البيانات، بدءاً من مرحلة الترجمة والتجميع (Compilation Phase)، مروراً بتهيئة مخزن مدخلات السجلات (Input Buffer)، وبناء متجه بيانات البرنامج (Program Data Vector – PDV)، وصولاً إلى مرحلة التنفيذ المتكرر (Execution Phase) التي تتولى تفريغ المشاهدات في مجموعة البيانات النهائية.

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

1. المدخل النظري لإدخال البيانات المباشر في بيئة SAS

1.1 مفهوم عبارة Datalines ودورها في خطوة البيانات (DATA Step)

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

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

تتجلى الفروق التشغيلية بين قراءة البيانات المضمنة عبر Datalines واسترجاع البيانات من مصادر خارجية (External Files) عبر عبارة INFILE في اعتبارات الأداء والارتباط؛ فالبيانات المضمنة تلغي الاعتماد على مسارات التخزين الفيزيائية (Physical File Paths) ومشاكل الصلاحيات الشبكية، مما يجعل البرنامج النصي مستقلاً بذاته تماماً وقابلاً للنقل الفوري والتشغيل المباشر عبر مختلف بيئات ساس دون الحاجة لنقل ملفات ملحقة، في حين تظل الملفات الخارجية الخيار الأمثل للتعامل مع البيانات الضخمة التي تتجاوز سعة الملفات المصدرية المقروءة بشرياً.

1.2 السياق البحثي والتطبيقي لاستخدام البيانات المباشرة

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

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

علاوة على ذلك، تبرز الحاجة التطبيقية لعبارة Datalines في التعامل مع مصفوفات البيانات الصغيرة، وبيانات التجارب المعملية المحدودة (Laboratory Bioassays)، وجداول الثوابت الإحصائية، وجداول البحث المرجعي (Lookup Tables). ففي هذه الحالات، يكون فصل البيانات في ملفات نصية خارجية (مثل ملفات CSV أو TXT) عبئاً تشغيلياً لا مسوغ له يزيد من تعقيد إدارة الملفات، بينما يضمن دمجها عبر Datalines مركزية الشفرة، وتوحيد التوثيق، وتسهيل التدقيق البرمجي والتحقق من التكرارية العلمية (Reproducibility).

1.3 التطور التاريخي والعلاقة بين CARDS وDATALINES وLINES

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

مع تطور بنية نظم التشغيل والانتقال إلى الحوسبة التفاعلية والشاشات الطرفية، احتفظت لغة ساس بعبارة CARDS لأغراض التوافق الرجعي (Backward Compatibility)، لكنها قدمت لاحقاً الكلمة المفتاحية DATALINES كمعيار لغوي أكثر تعبيراً عن الطبيعة البرمجية الحديثة، ثم أتبعتها بالمرادف المختصر LINES. ومن الناحية الهندسية والوظيفية، فإن الكلمات المفتاحية الثلاث: CARDS وDATALINES وLINES، متطابقة تماماً داخل محرك ساس في الإصدارات الحديثة (SAS 9.4 وSAS Viya)؛ حيث يتم توجيهها جميعاً إلى نفس الوحدة المعالجة داخل النواة البرمجية دون أي تباين في تخصيص الذاكرة أو سرعة المعالجة.

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

2. البنية التركيبية والقواعد النحوية الأساسية لعبارة Datalines

2.1 الهيكل القياسي لخطوة البيانات المتضمنة لـ Datalines

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

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

تُختتم كتلة البيانات المضمنة بعبارة الإنهاء الفارغة المتمثلة في فاصلة منقوطة منفردة (;) موضوعة في بداية سطر جديد تماماً يلي آخر سطر بيانات، يعقبها مباشرة عبارة RUN; التي تصدر الأمر لمحرك ساس بالبدء الفعلي في تنفيذ حلقة المعالجة التكرارية وتوليد الجدول الإحصائي، كما يوضح التسلسل البرمجي النمطي التالي:

DATA WORK.sample_measurements;
    INPUT Subject_ID Age Score Treatment_Group $;
DATALINES;
101 24 88.5 Control
102 29 92.0 Active
103 31 79.5 Active
104 22 84.0 Control
;
RUN;

2.2 الميكانيكية الداخلية لقراءة الأسطر ومعالجة السجلات

لفهم كيفية معالجة ساس للبيانات المضمنة، يجب الغوص في البنية المعمارية للنظام أثناء مرحلة التنفيذ (Execution Phase). يمتلك ساس كيانين مؤقتين في الذاكرة العشوائية لإدارة هذه العملية: مخزن مدخلات البيانات (Input Buffer) ومتجه بيانات البرنامج (Program Data Vector – PDV). عند انطلاق خطوة البيانات، يتم تخصيص مخزن المدخلات لاستقبال سطر واحد من البيانات الخام المتدفقة من كتلة Datalines في كل دورة معالجة.

يقوم محرك ساس بقراءة السطر الأول من Datalines وتحميله كلياً داخل الـ Input Buffer، ثم يتولى مؤشر الأعمدة الداخلي (Column Pointer) مسح السجل من اليسار إلى اليمين مستنداً إلى التوجيهات المصرحة في عبارة INPUT. تُستخلص القيم الفردية وتُحول إلى أنماطها التخزينية المحددة (رقمية أو نصية)، ثم تُنقل إلى المواقع المخصصة لها داخل الـ PDV، الذي يحتوي بدوره على قيم المتغيرات المصرحة بالإضافة إلى المتغيرات التلقائية المدمجة مثل متغير رقم الملاحظة (_N_) ومتغير كشف الأخطاء (_ERROR_).

بمجرد وصول المعالجة إلى نهاية خطوة البيانات التكرارية (التي تُمثل افتراضياً عبارة OUTPUT الضمنية)، تُفرغ محتويات الـ PDV كسجل مكتمل داخل مجموعة بيانات ساس النهائية في القرص أو الذاكرة. بعد ذلك، يتم تصفير قيم المتغيرات غير المحفوظة في الـ PDV إلى قيم مفقودة (Missing Values)، ويتحرك المؤشر لقراءة السطر التالي من كتلة Datalines ونقله إلى مخزن المدخلات، وتتكرر هذه الحلقة الحسابية حتى تصادف المعالجة الفاصلة المنقوطة المنفردة التي تُشير إلى نهاية ملف البيانات (End-Of-File – EOF)، وعندها تُغلق مجموعة البيانات وتنتقل السيطرة إلى الخطوة البرمجية التالية.

2.3 قواعد التنسيق العامة ومحددات السطور والأعمدة

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

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

من المحظورات النحوية المطلقة في لغة ساس إدراج أي أوامر برمجية أو تعليقات توضيحية داخل الكتلة المحصورة بين عبارة Datalines وفاصلة الإنهاء المنقوطة. إن كتابة أي تعليمة، مثل عبارة IF شرطية أو عبارة حسابية بعد Datalines، سيؤدي إلى معاملتها فوراً كقيم بيانات خام، مما يقود إلى تشويه السجلات وتوليد تحذيرات حرجة لعدم تطابق الأنواع (Data Type Mismatch Errors)، أو فشل كامل في إنشاء مجموعة البيانات.

3. توصيف المتغيرات وضبط الأنماط عبر عبارة INPUT

3.1 تعريف المتغيرات العددية (Numeric Variables)

تمثل المتغيرات العددية النمط التخزيني الافتراضي في نظام SAS؛ فبمجرد ذكر اسم المتغير مجرداً في عبارة INPUT دون إلحاقه بأي رموز خاصة أو محددات نوعية، يفترض النظام تلقائياً أن الحقل المقابل في سطر البيانات يمثل قيمة رقمية قياسية. يقوم مفسر ساس بقراءة السلسلة النصية الممثلة للرقم من مخزن المدخلات وتحويلها إلى تمثيل النقطة العائمة ذي الدقة المزدوجة (Double-Precision Floating-Point Representation) وفق معيار IEEE القياسي، مما يتيح إجراء كافة العمليات الرياضية والإحصائية عليها لاحقاً دون الحاجة لأي عمليات تحويل وسيطة.

يدعم التعريف القياسي للمتغيرات العددية استيعاب مختلف الأشكال الرياضية للأرقام، بما في ذلك الأعداد الصحيحة الموجبة والسالبة (المسبوقة بعلامة -)، والكسور العشرية المحتوية على النقطة كفاصلة عشرية معيارية، بالإضافة إلى الأعداد المكتوبة بالترميز العلمي الأسي (Scientific Notation مثل 1.5E4 للتعبير عن 15000). وتتولى عبارة INPUT معالجة هذه الأنماط بسلاسة متناهية، شريطة خلو الحقل الرقمي من أي رموز مالية أو نصوص غير رقمية ما لم تُستخدم تنسيقات إدخال خاصة (Informats).

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

3.2 تعريف المتغيرات النصية/الحرفية (Character Variables)

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

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

تتسم المتغيرات النصية في ساس بالحساسية الصارمة لحالة الأحرف (Case Sensitivity) عند التعامل مع اللغات اللاتينية؛ فالنص “Control” يختلف برمجياً وتحليلياً عن “control” أو “CONTROL”. كما تتعامل عبارة INPUT مع المسافات البادئة واللاحقة وفقاً لنمط القراءة المعتمد؛ حيث يتم تجاهل المسافات البادئة افتراضياً في نمط القائمة البسيط، بينما يتم الاحتفاظ بها في أنماط الإدخال بالأعمدة، مما يستوجب عناية خاصة عند هيكلة السطور النصية لتفادي أخطاء التصنيف في مراحل التحليل اللاحقة.

3.3 تسمية المتغيرات وفق المعايير القياسية لـ SAS

يخضع اختيار أسماء المتغيرات في عبارة INPUT لمنظومة من القواعد النحوية والمعايير القياسية الصارمة التي تضمن سلامة الشفرة وقابليتها للترجمة والتشغيل عبر مختلف إصدارات النظام. يحدد نظام SAS في نسخته القياسية القواعد الإلزامية التالية لتسمية المتغيرات الإحصائية والحقلية:

  • يجب ألا يتجاوز طول اسم المتغير 32 حرفاً (وفق خيار النظام VALIDVARNAME=V7 القياسي).
  • يجب أن يبدأ اسم المتغير دائماً بحرف أبجدي لاتيني (A-Z أو a-z) أو بشرطة سفلية (_)، ولا يجوز إطلاقاً أن يبدأ برقم.
  • يمكن أن تحتوي الأحرف اللاحقة داخل الاسم على مزيج من الحروف، والأرقام، والشرطات السفلية فقط، مع حظر استخدام المسافات البيضاء والرموز الخاصة مثل (@, #, $, %, -, &, *).
  • تجنب استخدام الكلمات المحجوزة في نظام SAS التي تعبر عن متغيرات نظامية مدمجة (مثل _N_, _ERROR_, _CMD_, _IORC_) لمنع التداخل والتعارض مع عمليات المعالجة الداخلية للمحرك.

من منظور هندسة البرمجيات والتوثيق الأكاديمي، يُنصح دائماً بتجاوز التسميات الغامضة والمختصرة المفرطة (مثل X1, V2, TEMP) واستبدالها بأسماء وصفية ذات دلالة إحصائية واضحة وقابلة للقراءة الذاتية (مثل Patient_Age, Baseline_Systolic_BP, Log_Transformed_Income). إن هذا النهج لا يرفع فقط من موثوقية الشفرة وسهولة مراجعتها من قِبل الباحثين المستقلين، بل يقلل أيضاً من احتمالات الخطأ البشري عند كتابة الأوامر التحليلية واستدعاء المتغيرات في الإجراءات الإحصائية المتقدمة.

4. إنشاء مجموعات بيانات تحتوي على متغيرات عددية بحتة

4.1 بناء النماذج الرقمية البسيطة ومتعددة الأبعاد

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

DATA WORK.cardio_metrics;
    INPUT HeartRate SystolicBP DiastolicBP VO2Max TotalCholesterol;
DATALINES;
72 120 80 45.2 195
68 118 78 48.6 182
85 142 92 34.1 245
64 110 72 52.0 168
78 130 85 39.8 210
;
RUN;

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

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

4.2 التحقق البرمجي ومعاينة البيانات المنشأة

بعد اكتمال تنفيذ خطوة البيانات وتوليد مجموعة السجلات عبر Datalines، يُعد من متطلبات الانضباط البرمجي والبحثي إجراء فحص فوري ومزدوج للتحقق من سلامة البناء الهيكلي ودقة التخزين البياني. يتم هذا التحقق عبر مسارين رئيسيين: الأول هو استعراض المحتوى الفعلي عبر إجراء الطباعة الإحصائي PROC PRINT، والثاني هو تدقيق الخصائص الوصفية والقاموس الداخلي للجدول باستخدام إجراء المحتويات PROC CONTENTS.

يوفر الإجراء PROC PRINT معاينة جدولية مباشرة للمشاهدات التي تمت قراءتها من سياق Datalines، مما يتيح للباحث التأكد البصري من تطابق القيم مع المتغيرات المستهدفة وخلو البيانات من أي إزاحات حقلية ناتجة عن مسافات خاطئة، كما يوضح الأمر التالي:

PROC PRINT DATA=WORK.cardio_metrics NOOBS;
    TITLE “معاينة مصفوفة القياسات الفسيولوجية المنشأة”;
RUN;

من جانب آخر، يضطلع الإجراء PROC CONTENTS بمهمة حيوية تتمثل في الكشف عن البنية العميقة للجدول (Metadata)، متضمناً عدد المشاهدات الكلي، وعدد المتغيرات، ونوع التخزين الداخلي لكل متغير، وترتيب الحقول في الذاكرة. بالتوازي مع ذلك، يجب فحص سجل ساس (SAS Log) بدقة متناهية؛ حيث يُصدر النظام رسالة إرشادية قياسية بنمط:

NOTE: The data set WORK.CARDIO_METRICS has 5 observations and 5 variables.
NOTE: DATA statement used (Total process time): real time 0.01 seconds…

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

5. إنشاء مجموعات بيانات تجمع بين المتغيرات النصية والعددية

5.1 دمج البيانات الفئوية والكمية في سجل بيانات موحد

تتطلب معظم التطبيقات الإحصائية والوبائية دمج المتغيرات الفئوية (Categorical Variables) التي تُمثل المجموعات التجريبية أو الخصائص الديموغرافية، مع المتغيرات الكمية (Continuous/Quantitative Variables) التي تمثل القياسات الرقمية والاختبارات الحيوية. يتم تحقيق هذا التكامل عبر عبارة INPUT من خلال المزاوجة الدقيقة بين أسماء المتغيرات المجردة والمتغيرات المعرفة بعلامة الدولار ($)، مع الحفاظ على تطابق مطلق بين ترتيب التصريح في العبارة وترتيب الحقول في أسطر Datalines.

يوضح النموذج التطبيقي التالي كيفية بناء قاعدة بيانات متكاملة لدراسة سريرية تدمج المعرفات الفردية، والنوع، والفئة العلاجية، والعمر، وضغط الدم، والنتيجة السريرية:

DATA WORK.clinical_trial_data;
    INPUT Subject_Code $ Gender $ Arm $ Age Baseline_BP Final_BP Response_Status $;
DATALINES;
SUBJ_01 Male Drug_A 45 140 120 Responder
SUBJ_02 Female Drug_A 52 155 128 Responder
SUBJ_03 Male Placebo 48 138 136 NonResponder
SUBJ_04 Female Placebo 61 160 158 NonResponder
SUBJ_05 Female Drug_A 39 130 115 Responder
;
RUN;

في هذا النموذج، يقوم مؤشر القراءة في خطوة البيانات بالتبديل الديناميكي بين وضع التخزين النصي والوضع الرقمي داخل الـ PDV؛ فعند مصادفة المتغير الأول (Subject_Code $)، يُهيئ النظام مخزن الحروف ليقرأ السلسلة النصية “SUBJ_01″، ثم ينتقل تلقائياً لقراءة المتغير التالي (Gender$) كنص، ثم يتحول عند وصوله إلى المتغير الرابع (Age) لقراءة القيمة 45 كعدد مزدوج الدقة. إن الحفاظ على هذا الترتيب البنيوي يمنع التداخل الكارثي بين الأنماط الذي قد يؤدي إلى إفساد السجل بالكامل.

5.2 معالجة النصوص المحتوية على مسافات داخلية

تفرض السلاسل النصية التي تحتوي على مسافات بيضاء فاصلة بين كلماتها (مثل الأسماء المركبة، أو العناوين، أو التشخيصات الطبية مثل “Type 2 Diabetes” أو “New York”) تحدياً جوهرياً لنمط إدخال القائمة القياسي؛ إذ يعتبر نظام SAS المسافة المفردة الافتراضية فاصلاً حقلياً (Delimiter) يُنهي قراءة المتغير الحالي ويبدأ في تعبئة المتغير التالي. وإذا لم تُعالج هذه الظاهرة، فسيؤدي وجود مسافة داخل النص إلى ترحيل الكلمة الثانية لتُقرأ خطأً كقيمة للمتغير الرقمي أو النصي اللاحق، مما يُحدث فوضى عارمة في هيكل السجل.

للتغلب على هذه المعضلة داخل سياق عبارة Datalines دون الحاجة للتحول الكامل إلى نمط الأعمدة، توفر لغة SAS محدد التنسيق المعدل (&). عند وضع علامة & بعد علامة الدولار الخاصة بالمتغير النصي في عبارة INPUT، يُخطر النظام بأن هذا المتغير قد يحتوي على مسافات مفردة داخلية، وأن نهاية الحقل لن تُحدد إلا عند مصادفة مسافتين متتاليتين على الأقل (Two or more blank spaces) أو الوصول لنهاية السطر، كما يوضح المثال التالي:

DATA WORK.patient_diagnoses;
    INPUT Patient_ID $ Diagnosis & $25. Severity_Score;
DATALINES;
P001 Type 2 Diabetes 8.5
P002 Chronic Kidney Disease 9.2
P003 Essential Hypertension 6.0
P004 Acute Heart Failure 9.8
;
RUN;

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

6. أساليب وأنماط قراءة البيانات المتقدمة عبر Datalines

6.1 نمط الإدخال بالقائمة (List Input Method)

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

ومع هذه المرونة، يفرض نمط القائمة محددات تشغيلية وافتراضات صارمة يجب مراعاتها بدقة:

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

6.2 نمط الإدخال بالأعمدة (Column Input Method)

يوفر نمط الإدخال بالأعمدة (Column Input) حلاً معمارياً قوياً للتعامل مع البيانات المنظمة في هيئة جداول ذات حدود مكانية ثابتة ومحاذاة رأسية متطابقة. في هذا النمط، يُلحق اسم المتغير في عبارة INPUT بأرقام الأعمدة الفيزيائية التي تحدد بدقة موقع بداية ونهاية الحقل في السطر الخام (مثال: Age 6-7 أو Patient_Name $ 9-30). يتيح هذا التحديد الصارم للنظام قراءة محتوى الحقل مباشرة من تلك الإحداثيات المكانية دون الاعتماد على وجود مسافات فاصلة.

يتيح نمط الأعمدة مزايا متقدمة تتفوق على نمط القائمة في حالات محددة:

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

6.3 نمط الإدخال المنسق (Formatted Input Method)

يمثل نمط الإدخال المنسق (Formatted Input) الأسلوب الأكثر تقدماً واحترافية في معالجة السجلات البيانية المعقدة عبر Datalines؛ إذ يجمع بين مرونة التوجيه المكاني وقوة مؤشرات التنسيق المسبق (Informats). تُمكّن مؤشرات التنسيق مجمع ساس من قراءة البيانات غير القياسية، كالتواريخ المكتوبة بصيغ متعددة (مثل 15/04/2023 أو 15APR2023)، والأوقات، والأرقام المنسقة المحتوية على فواصل آلاف وفواصل عشرية (مثل 1,250,000.50)، والعملات المالية المسبوقة برموز نقدية (مثل $500.00).

يعتمد هذا النمط على دمج اسم المتغير مع مؤشر التنسيق المناسب (مثل Date_Of_Birth MMDDYY10. أو Salary COMMA12.2)، بالتكامل مع محددات توجيه مؤشر الأعمدة المتقدمة مثل محدد التوجيه المطلق (@n) الذي يوجه مؤشر القراءة فورياً إلى العمود رقم n، ومحدد التوجيه النسبي (+n) الذي يحرك المؤشر للأمام بمقدار n عموداً، كما يوضح المثال التالي:

DATA WORK.employee_registry;
    INPUT @1 Emp_ID $4. @6 Hire_Date DATE9. @16 Salary COMMA9. @26 Department$15.;
DATALINES;
E101 15JAN2020 $75,000.00 Data Science
E102 01JUN2018 $92,500.00 Biostatistics
E103 23MAR2021 $68,000.00 Epidemiology
;
RUN;

يقوم محرك ساس في هذا النمط بتحويل التواريخ آلياً إلى قيم رقمية تمثل عدد الأيام المنقضية منذ الأول من يناير عام 1960 (SAS Epoch Reference)، مما يسهل العمليات الحسابية الزمنية عليها لاحقاً مع الحفاظ على الدقة المطلقة في التخزين الداخلي.

7. التحكم في تدفق سجلات الإدخال ومؤشرات الأسطر

7.1 استخدام علامة التثبيت المفردة (@)

في نمط المعالجة القياسي لخطوة البيانات، يقوم نظام ساس بإصدار أمر تفريغ تلقائي لمخزن المدخلات والانتقال فورياً إلى سطر الإدخال التالي بمجرد انتهاء تنفيذ عبارة INPUT. ومع ذلك، تتطلب العديد من الخوارزميات والسيناريوهات المتقدمة تعليق هذا الانتقال التلقائي، وإبقاء السطر الحالي قيد الانتظار في الـ Input Buffer لإخضاعه لاختبارات شرطية، أو لقراءة حقول إضافية بناءً على قرارات منطقية لاحقة. يتحقق هذا التحكم الفائق باستخدام علامة التثبيت المفردة (Single Trailing @) في نهاية عبارة INPUT.

عند وضع علامة @ كآخر عنصر في عبارة INPUT، يتم إيقاف تحرير السطر الحالي، مما يسمح بتنفيذ عبارات IF-THEN البرمجية على المتغير المقروء أولاً، ثم استدعاء عبارة INPUT ثانية لقراءة بقية السطر وفق قواعد مخصصة بناءً على القيمة الأولية، كما يوضح النموذج المعملي التالي:

DATA WORK.conditional_bioassay;
    INPUT Assay_Type $ @;
    IF Assay_Type = ‘ELISA’ THEN DO;
        INPUT Optical_Density Concentration Dilution_Factor;
        OUTPUT;
    END;
    ELSE IF Assay_Type = ‘PCR’ THEN DO;
        INPUT Cycle_Threshold Target_Gene $ Copy_Number;
        OUTPUT;
    END;
DATALINES;
ELISA 0.854 12.5 100
PCR 22.4 GAPDH 450000
ELISA 1.240 25.0 50
PCR 18.1 ACTB 1200000
;
RUN;

يظل مؤشر السطر محتجزاً ومثبتاً حتى تصادف دورة المعالجة عبارة INPUT خالية من علامة التثبيت، أو تصل الخطوة إلى نهاية التكرار (Return to top of DATA Step)، حيث يُحرر السطر ويتحرك المؤشر نحو المشاهدة التالية في سياق Datalines.

7.2 استخدام علامة التثبيت المزدوجة (@@) لقراءة سطور متعددة

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

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

DATA WORK.experimental_replicates;
    INPUT Group_ID $ Dosage Response @@;
DATALINES;
Ctrl 0.0 12.4 Ctrl 0.0 14.1 Ctrl 0.0 11.8 TrtA 10.0 25.4
TrtA 10.0 28.1 TrtA 10.0 26.5 TrtB 20.0 45.2 TrtB 20.0 48.9
;
RUN;

في هذا المثال، تقرأ عبارة INPUT الثلاثية الأولى (Ctrl 0.0 12.4)، وتُفرغ السجل الأول في مجموعة البيانات عبر أمر الإخراج الضمني، ثم تبدأ دورة المعالجة الثانية للـ DATA Step من نفس السطر دون الانتقال للسطر التالي، لتقرأ المشاهدة الثانية (Ctrl 0.0 14.1)، وتستمر هذه الميكانيكية التكرارية حتى ينفد السطر الأول، وعندها فقط ينتقل النظام بسلاسة إلى السطر الثاني لمواصلة القراءة حتى الوصول لفاصلة الإنهاء المنقوطة.

7.3 التحكم في القفز بين الأسطر داخل المشاهدة الواحدة

في العديد من الدراسات الميدانية، واستمارات الاستبيانات النفسية والسلوكية الموسعة، قد تمتد المشاهدة الإحصائية الواحدة للشخص المفحوص عبر عدة أسطر متتالية من البيانات الخام. يوفر نظام SAS أداتين رئيسيتين للتحكم في توجيه مؤشر الأسطر لقراءة هذه البيانات متعددة السطور ضمن سجل موحد: محدد الخط المائل (/) ومحدد السجل المطلق (#n).

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

DATA WORK.multi_line_survey;
    INPUT #1 Respondent_ID $ Age Gender $
          #2 Education_Level $ Income Household_Size
          #3 Sat_Score_1 Sat_Score_2 Sat_Score_3;
DATALINES;
RESP_001 34 Female
Postgraduate 85000 4
5 4 5
RESP_002 45 Male
Undergraduate 62000 3
4 3 4
;
RUN;

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

8. التعامل مع القيم المفقودة (Missing Values) والبيانات الشاذة

8.1 تمثيل وترميز القيم المفقودة في تدفق Datalines

تُعد معالجة البيانات المفقودة (Missing Data) ركيزة أساسية لضمان سلامة الاستدلال الإحصائي؛ إذ نادراً ما تخلو الدراسات الميدانية والتجارب السريرية من حالات عدم استجابة أو قياسات غير مكتملة. يعتمد نظام SAS منهجية قياسية صارمة لتمثيل القيم المفقودة داخل كتلة Datalines؛ حيث يُمثل الفقدان في المتغيرات العددية بوضع رمز النقطة المفردة (.) كبديل للقيمة الرقمية في نمط الإدخال بالقائمة.

أما بالنسبة للمتغيرات النصية، فيتم تمثيل القيمة المفقودة إما بترك مسافة فارغة محددة النطاق في نمط الأعمدة، أو بوضع نقطة مفردة (.) أو مسافة محاطة بعلامات اقتباس في بعض الأنماط، حيث تُفسر النقطة في الحقل النصي كحرف عادي ما لم تُعالج كرمز خاص. ويوفر نظام SAS إمكانية متقدمة للغاية تتمثل في القيم المفقودة الخاصة (Special Missing Values) للمتغيرات العددية، والممثلة بنقطة متبوعة بحرف أبجدي كبير من (.A إلى .Z) أو شرطة سفلية (._).

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

DATA WORK.clinical_missing_analysis;
    INPUT Subject_ID $ Baseline_Score Week4_Score Week8_Score;
DATALINES;
S101 45.5 50.2 55.0
S102 38.0 .A .B
S103 42.1 44.0 .C
S104 51.0 . 58.2
;
RUN;

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

8.2 معالجة مشكلة انتهاء السطر المبكر وقيم TRUNCOVER

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

لإلزام محرك ساس بالانضباط ومنع هذا القفز العشوائي عبر السطور، يُستخدم خيار TRUNCOVER (أو خيار MISSOVER) المقترن بعبارة INFILE CARDS (أو INFILE DATALINES) التي تسبق عبارة INPUT مباشرة داخل خطوة البيانات. يوجه خيار TRUNCOVER المؤشر بقراءة أقصى ما يمكن استخلاصه من السطر الحالي وتعيين باقي المتغيرات غير المكتملة كقيم مفقودة، مع التوقف التام عند نهاية السطر والانتقال للمشاهدة التالية بشكل مستقل ونظيف، كما يوضح المثال التالي:

DATA WORK.controlled_records;
    INFILE DATALINES TRUNCOVER;
    INPUT Patient_ID $ 1-5 Test1 7-9 Test2 11-13 Test3 15-17 Description $ 19-35;
DATALINES;
PT001 85 90 95 Normal Assessment
PT002 78 82
PT003 92 88 91 Requires Follow-up
;
RUN;

بفضل استخدام خيار TRUNCOVER، تمكن النظام من قراءة السجل الثاني (PT002) دون أن يقفز للسطر الثالث للبحث عن قيمتي Test3 وDescription؛ حيث عيّن لهما تلقائياً قيماً مفقودة، وظل السطر الثالث مستقلاً ومحافظاً على بنيته المكانية السليمة، مما يضمن اتساق الجدول الإحصائي النهائي.

9. معالجة البيانات النصية المعقدة: عبارة Datalines4 و Cards4

9.1 إشكالية وجود الفاصلة المنقوطة (;) داخل البيانات الخام

تعتمد قواعد لغة SAS على الفاصلة المنقوطة (;) كأمر نحوي حاسم لإنهاء العبارات البرمجية وتحديد أطر كتل الأوامر. وعند التعامل مع عبارة Datalines القياسية، يترصد مجمع ساس أول فاصلة منقوطة تظهر في الأسطر ليعتبرها فوراً إشارة انتهاء كتلة البيانات المضمنة (End of In-stream Data Indicator). تخلق هذه الآلية أزمة برمجية كبرى عندما تحتوي البيانات النصية الخام المراد إدخالها على فواصل منقوطة أصلية كجزء من بنية النص (مثل الشفرات البرمجية المخزنة، والاستفسارات النصية المعقدة، والتقارير الطبية السردية، أو نصوص اللغات المتضمنة لعلامات ترقيم مكثفة).

إذا حاول المبرمج استخدام عبارة Datalines التقليدية لإدخال سطر مثل:
TX101; Severe condition; Immediate admission required
فإن مفسر ساس سيتوقف قسراً عند مصادفة الفاصلة المنقوطة الأولى بعد TX101، محاولاً تفسير باقي السطر كأوامر برمجية تالية، مما يولد على الفور أخطاء نحوية حرجة (Syntax Errors) في سجل النظام، وتتوقف خطوة البيانات عن التنفيذ تماماً.

9.2 القواعد التركيبية لعبارة Datalines4 ومحدد الإنهاء المزدوج

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

تقتضي القواعد النحوية لعبارة DATALINES4 استخدام محدد إنهاء فريد وحصري يتألف من أربع فواصل منقوطة متتالية (;;;;) تُكتب في بداية سطر مستقل تماماً بعد انتهاء آخر سطر بيانات، ليعلن للنظام رسمياً إغلاق كتلة التدفق والعودة للوضع البرمجي القياسي، كما يوضح المثال التالي:

DATA WORK.medical_clinical_notes;
    INFILE DATALINES4 TRUNCOVER;
    INPUT Note_ID $ Patient_Record & $100.;
DATALINES4;
NOTE_01 Patient presented with BP: 140/90; Pulse: 85; No acute distress noted.
NOTE_02 Administered Drug_X; Dose: 50mg; Re-evaluated after 2 hours; Stable.
NOTE_03 History of Asthma; Allergies: Penicillin; Recommended follow-up in 3 weeks.
;;;;
RUN;

تمكنت خطوة البيانات في هذا المثال من استيعاب التقارير السريرية المحتوية على فواصل منقوطة متعددة داخل النصوص بسلاسة فائقة، ولم تنتهِ عملية القراءة إلا عند مصادفة السلسلة الرباعية ;;;;، مما حافظ على سلامة البيانات ومرونة التوثيق.

9.3 المقارنة الفنية بين Datalines و Datalines4

يوضح الجدول والتحليل المقارن التالي الفروق الجوهرية والتشغيلية بين عبارة Datalines القياسية وعبارة Datalines4 المتقدمة لضبط معايير الاختيار البرمجي:

  • حساسية الفاصلة المنقوطة: تنهي Datalines تدفق البيانات بمجرد ظهور فاصلة منقوطة مفردة (;)، بينما تتجاهل Datalines4 الفواصل المنقوطة الداخلية وتتطلب حصرياً أربع فواصل منقوطة (;;;;) لإغلاق الكتلة.
  • طبيعة البيانات المستهدفة: تُعد Datalines مثالية للمصفوفات الرقمية والجداول التصنيفية القياسية، بينما تُخصص Datalines4 للنصوص الحرة، ومقتطفات الشفرات (Source Code Snippets)، والبيانات الوصفية الغنية بعلامات الترقيم.
  • الأداء والحمل المعالج: يتطابق الأداء الحسابي وسرعة تخصيص الذاكرة في كلتا العبارتين داخل محرك ساس؛ حيث لا تفرض Datalines4 أي عبء تشغيلي إضافي على المعالج.
  • التوافقية السحابية: تتوافق العبارتان تماماً مع محركات المعالجة السحابية الحديثة في بيئة SAS Viya، ومحررات SAS Studio، مع ضرورة الالتزام بوضع محددات الإنهاء في بداية الأسطر لتفادي أخطاء المحاذاة.

10. استكشاف الأخطاء وتصحيحها في شفرات Datalines (Troubleshooting)

10.1 أخطاء عدم تطابق أنواع البيانات (Invalid Data Warnings)

تُعد رسالة التحذير “NOTE: Invalid data for variable…” واحدة من أكثر الإشارات التشخيصية شيوعاً في سجل SAS Log أثناء التعامل مع Datalines. تحدث هذه المشكلة عندما يواجه مؤشر القراءة قيمة نصية أو رمزاً غير صالح أثناء محاولة تعبئة متغير تم تصريحه كمتغير عددي (Numeric Variable) في عبارة INPUT. وفي هذه الحالة، يقوم نظام ساس بإسناد قيمة مفقودة (.) للمتغير في تلك المشاهدة، ويرفع قيمة المتغير النظامي _ERROR_ إلى 1، ثم يطبع سطراً تشخيصياً مفصلاً في السجل يوضح القيمة المكانية التي تسببت في الخطأ وموقعها من السطر ومخزن المدخلات.

تتضمن أسباب هذا التحذير إدخال أحرف نصية بالخطأ داخل الأرقام (مثل كتابة حرف ‘O’ الإنجليزي بدلاً من الرقم صفر ‘0’)، أو استخدام الفواصل العادية (,) داخل الأرقام دون استخدام مؤشر التنسيق COMMAw.d المناسب، أو إزاحة الأعمدة في نمط القراءة الموقعي. ويتطلب التصحيح مراجعة سطر السجل التشخيصي وتصحيح القيمة المصدرية أو تعديل نمط الإدخال في عبارة INPUT ليتطابق مع الطبيعة الحقيقية للبيانات.

10.2 أخطاء قراءة السجلات غير المتوازنة (Lost Card / Truncation)

تظهر رسالة الخطأ الشهيرة “NOTE: SAS went to a new line when INPUT statement reached…” أو ما يُعرف تاريخياً بـ (Lost Card) عندما ينفد سطر البيانات الحالي قبل أن يستوفي المؤشر قراءة كافة المتغيرات المحددة في عبارة INPUT في ظل غياب خيارات التحكم بالسطر. يؤدي هذا السلوك التلقائي إلى قيام ساس بالتهام السطر التالي لإكمال النقص، مما يتسبب في فقدان مشاهدة كاملة وتشويه السجلات المتبقية وانهيار التوازن الهيكلي للجدول بأكمله.

لتشخيص هذه المشكلة بدقة، يجب مقارنة عدد الأسطر المكتوبة في Datalines مع عدد المشاهدات المسجل في الـ SAS Log؛ فإذا كان عدد المشاهدات المنشأة أقل من عدد الأسطر المكتوبة، فهذا دليل قاطع على حدوث قفز سطري غير مقصود. ويتم تصحيح هذا الخلل عبر إدراج عبارة INFILE DATALINES TRUNCOVER; لضبط حدود القراءة، أو التحقق من محاذاة الفواصل والمسافات والتأكد من عدم نسيان أي حقل بياني في الأسطر المصدرية.

10.3 قراءة وتفسير رسائل سجل SAS Log باحترافية

يُمثل سجل الأحداث (SAS Log) الأداة التشخيصية والتحليلية الأولى لمبرمج ومحلل ساس المحترف؛ إذ يقدم توثيقاً متناهي الدقة لكل مرحلة من مراحل دورة حياة خطوة البيانات. ويصنف النظام رسائل السجل إلى ثلاثة مستويات رئيسية:

  • الملاحظات الإرشادية (Notes – باللون الأزرق غالباً): توثق نجاح العمليات، وتوضح عدد المشاهدات والمتغيرات المنشأة، وحجم الذاكرة المستهلك، وزمن التنفيذ الفيزيائي والمعالجي.
  • التحذيرات التنبيهية (Warnings – باللون الأخضر): تشير إلى وجود تجاوزات غير حرجة، مثل تحويلات الأنواع التلقائية (Implicit Type Conversions) أو تكرار أسماء المتغيرات، والتي تسمح باستمرار التنفيذ لكنها قد تقود لنتائج غير مقصودة.
  • الأخطاء الحرجة (Errors – باللون الأحمر): توضح حدوث إخفاق بنيوي حرج (مثل خطأ نحوي في Datalines أو غياب فاصلة الإنهاء المنقوطة)، مما يؤدي إلى إيقاف تنفيذ خطوة البيانات فورياً وعدم إنشاء الجدول النهائي.

بعد تصحيح أي أخطاء استناداً لمؤشرات السجل، يُنصح دائماً بتشغيل الإجراء الإحصائي PROC DATASETS لفحص البنية الداخلية للمكتبة والتأكد من سلامة المؤشرات وحذف أي مجموعات بيانات تالفة قد تكون نتجت عن محاولات تنفيذ سابقة غير مكتملة.

11. أفضل الممارسات البرمجية وتوثيق البيانات باستخدام Datalines

11.1 إثراء مجموعة البيانات بالبيانات الوصفية (Metadata Enrichment)

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

  • عبارة LABEL: تُستخدم لإسناد تسميات وصفية كاملة وممتدة للمتغيرات (تصل إلى 256 حرفاً)، مما يتيح استبدال الأسماء البرمجية المختصرة بنصوص عربية أو إنجليزية موسعة تظهر في كافة التقارير والجداول الإحصائية المخرجة.
  • عبارة FORMAT: تُحدد كيفية عرض القيم الرقمية والتواريخ في المخرجات النهائية (مثل عرض الأرقام بفواصل عشرية محددة أو تنسيق التواريخ بصيغة DATE9.) دون التأثير على دقتها التخزينية الأصلية في الذاكرة.
  • عبارة ATTRIB: توفر أسلوباً برمجياً موحداً يجمع بين تحديد النوع، والطول، والتسمية الوصفية، وتنسيق الإدخال والإخراج لكل متغير في تعليمة هيكلية واحدة عالية الكفاءة.

يوضح النموذج التالي التطبيق المتكامل لإثراء البيانات الوصفية داخل خطوة بيانات Datalines:

DATA WORK.enriched_clinical_data;
    ATTRIB Subject_ID LENGTH=$6. LABEL=’المعرف الرقمي للمريض’
           Visit_Date LENGTH=8 LABEL=’تاريخ الزيارة السريرية’ FORMAT=YYMMDD10. INFORMAT=DATE9.
           Cholesterol LENGTH=8 LABEL=’مستوى الكوليسترول الكلي (ملغ/ديسيلتر)’ FORMAT=6.1;
    INPUT Subject_ID Visit_Date Cholesterol;
DATALINES;
SUB101 12JAN2023 195.45
SUB102 15FEB2023 220.10
SUB103 20MAR2023 182.80
;
RUN;

11.2 تنظيم وتنسيق الشفرة لقابلية القراءة والصيانة

يُعد الالتزام بقواعد التنسيق البصري والمسافات البادئة (Indentation) أحد الركائز الأساسية لهندسة البرمجيات الإحصائية الموثوقة. عند كتابة خطوة بيانات تتضمن Datalines، يُنصح دائماً بإزاحة الأوامر البرمجية (مثل ATTRIB, INPUT, IF) بمقدار مسافتين إلى أربع مسافات عن هامش البداية لتمييزها بوضوح عن عبارات الإعلان (DATA وRUN)، بينما تُكتب عبارة DATALINES وفاصلة الإنهاء الخاصة بها (;) محاذية للهامش الأيسر تماماً.

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

11.3 الموازنة بين استخدام Datalines والاستيراد الخارجي

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

  • الحجم التخزيني والأمان: تُعد Datalines مثالية لمجموعات البيانات الصغيرة إلى المتوسطة (من بضعة سجلات إلى بضع مئات أو آلاف السجلات كحد أقصى لا يتجاوز بضعة ميجابايتات)، في حين يجب تجنبها تماماً مع قواعد البيانات الضخمة (Big Data) التي تؤدي إلى تضخيم غير مقبول لملف الشفرة المصدرية (.sas) وتعيق المحررات النصية.
  • ديناميكية البيانات: عند التعامل مع بيانات ثابتة ومحدودة لا تتغير (مثل جداول الأوزان المعيارية وثوابت القياس)، توفر Datalines حلاً ممتازاً يضمن بقاء الشفرة مستقلة بذاتها. أما إذا كانت البيانات تتحدث دورياً من مصادر خارجية، فإن استخدام الإجراء PROC IMPORT أو عبارة INFILE للمصادر الحية يضمن استدامة خطوط تدفق البيانات (Data Pipelines) دون الحاجة للتعديل اليدوي في الشفرة.
  • التحكم في الأخطاء: توفر ملفات الاستيراد الخارجية قدرات أوسع للتعامل مع الترميزات المعقدة (Encoding مثل UTF-8) والمحددات المخصصة، في حين تظل Datalines الأداة الأسرع والأكثر موثوقية للاختبارات المعملية والبرمجة الأولية.

12. تطبيقات وحالات دراسية عملية لتحليل البيانات في SAS

12.1 دراسة حالة 1: بناء مصفوفة استبيان نفسي لاختبار الفرضيات

في هذه الدراسة السلوكية التطبيقية، تم تصميم خطوة بيانات متكاملة باستخدام Datalines لإدخال درجات مقياس ليكرت الخماسي (Likert Scale) لتقييم أبعاد الرضا الوظيفي والاحتراق النفسي لدى عينة من الممارسين الصحيين، يعقبها تحليل إحصائي وصفي واختبارات توزيع التكرارات عبر الإجراءات PROC MEANS وPROC FREQ:

DATA WORK.psychological_assessment;
    ATTRIB Participant_ID LENGTH=$8. LABEL=’معرف المشارك’
           Department LENGTH=$12. LABEL=’القسم الطبي’
           Burnout_Score LENGTH=8 LABEL=’مؤشر الاحتراق النفسي’
           Job_Sat_Score LENGTH=8 LABEL=’مؤشر الرضا الوظيفي’;
    INPUT Participant_ID $ Department $ Burnout_Score Job_Sat_Score;
DATALINES;
MED_101 Emergency 4.2 2.1
MED_102 Emergency 4.8 1.8
MED_103 Pediatrics 2.4 4.5
MED_104 Pediatrics 1.9 4.8
MED_105 Surgery 3.8 3.0
MED_106 Surgery 4.1 2.5
MED_107 Oncology 3.5 3.2
MED_108 Oncology 3.2 3.9
;
RUN;

PROC MEANS DATA=WORK.psychological_assessment N MEAN STD MIN MAX MAXDEC=2;
    CLASS Department;
    VAR Burnout_Score Job_Sat_Score;
    TITLE “التحليل الإحصائي الوصفي لمؤشرات الاحتراق النفسي والرضا الوظيفي حسب القسم”;
RUN;

PROC FREQ DATA=WORK.psychological_assessment;
    TABLES Department / NOCUM;
    TITLE “توزيع التكرارات والنسب المئوية للمشاركين عبر الأقسام الطبية”;
RUN;

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

12.2 دراسة حالة 2: إدخال مصفوفات القياسات المتكررة وتحليل التباين

تتناول هذه الدراسة السريرية هيكلة بيانات تجربة دوائية تعتمد على تصميم القياسات المتكررة (Pre-test / Post-test Design) لمقارنة فعالية علاجين خافضين لضغط الدم مقارنة بمجموعة ضابطة، مع استخدام علامة التثبيت المزدوجة (@@) لتكثيف وضغط كتابة المشاهدات في Datalines، متبوعة بتنفيذ اختبار تحليل التباين أحادي الاتجاه عبر الإجراء PROC GLM:

DATA WORK.clinical_pre_post;
    INPUT Group $ Pre_Treatment Post_Treatment @@;
    Diff = Post_Treatment – Pre_Treatment;
DATALINES;
Placebo 150 148 Placebo 155 152 Placebo 148 147 Placebo 160 158
Drug_A 152 135 Drug_A 158 138 Drug_A 162 140 Drug_A 154 132
Drug_B 156 128 Drug_B 164 130 Drug_B 150 122 Drug_B 158 126
;
RUN;

PROC GLM DATA=WORK.clinical_pre_post;
    CLASS Group;
    MODEL Diff = Group;
    MEANS Group / TUKEY HOVTEST;
    TITLE “تحليل التباين الأحادي (ANOVA) لفروق ضغط الدم بين المجموعات العلاجية”;
RUN;
QUIT;

أتاح استخدام التثبيت المزدوج (@@) تنظيم مدخلات التجربة في ثلاثة أسطر شديدة الوضوح تعبر عن المجموعات الثلاث، مع حساب متغير الفارق (Diff) ديناميكياً داخل خطوة البيانات، ثم تمريره مباشرة لإجراء النموذج الخطي العام (GLM) لاختبار الدلالة الإحصائية لفروق المعالجات وتطبيق مقارنات توكي البعدية (Tukey’s Post-Hoc Test).

12.3 دراسة حالة 3: توليد جداول الاقتران والاختبارات اللامعلمية

في الدراسات الوبائية ودراسات الحالات والشواهد (Case-Control Studies)، غالباً ما تتوفر البيانات في صورة جداول تقاطع متقاطعة مجمعة (Cross-Tabulated Tables) تحتوي على خلايا التكرارات المرجحة بدلاً من سجلات الأفراد الفردية. توضح هذه الحالة كيفية إدخال جدول اقتران ثنائي (2×2 Contingency Table) باستخدام Datalines وتطبيق متغير الوزن الإحصائي عبر عبارة WEIGHT داخل الإجراء PROC FREQ لتنفيذ اختبار كاي تربيع (Chi-Square) وحساب نسبة الأرجحية (Odds Ratio):

DATA WORK.case_control_study;
    INPUT Exposure_Status $ Disease_Status $ Case_Count;
DATALINES;
Exposed Diseased 85
Exposed NonDiseased 115
Unexposed Diseased 30
Unexposed NonDiseased 170
;
RUN;

PROC FREQ DATA=WORK.case_control_study ORDER=DATA;
    WEIGHT Case_Count;
    TABLES Exposure_Status * Disease_Status / CHISQ RELRISK MEASURES;
    TITLE “تحليل جدول الاقتران واختبار كاي تربيع لحساب نسبة الأرجحية والمخاطر النسبية”;
RUN;

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

الخاتمة

تُمثّل عبارة Datalines إحدى الأدوات الأكثر رسوخاً وأهمية في ترسانة مبرمج ومحلل بيانات SAS؛ إذ تتجاوز كونها مجرد تعليمة لإدخال السطور لتشكل جسراً محورياً يربط بين مرحلتي الترجمة والتنفيذ في معمارية خطوة البيانات (DATA Step). إن استيعاب الآليات الدقيقة التي تحكم عمل مخزن المدخلات (Input Buffer) ومتجه بيانات البرنامج (PDV)، جنباً إلى جنب مع إتقان أنماط الإدخال بالقائمة والأعمدة والتنسيقات المتقدمة، يُكسب الباحث مرونة فائقة في نمذجة البيانات المعقدة والتحكم في مؤشرات الأسطر عبر تقنيات التثبيت المفرد والمزدوج (@ و @@).

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

References

  • Cody, R. (2018). Learning SAS by Example: A Programmer’s Guide (2nd ed.). SAS Institute Inc. https://support.sas.com/en/books.html
  • Delwiche, L. D., & Slaughter, S. J. (2019). The Little SAS Book: A Primer (6th ed.). SAS Institute Inc. https://www.sas.com/store/books/categories/usage-and-reference/the-little-sas-book-sixth-edition/prodBK_69064_en.html
  • SAS Institute Inc. (2021). SAS® 9.4 Statements: Reference. SAS Institute Inc. https://documentation.sas.com/doc/en/pgmsascdc/9.4_3.5/lestmtsref/titlepage.htm
  • SAS Institute Inc. (2020). SAS® Viya® Programming Guide: DATA Step Basics. SAS Institute Inc. https://documentation.sas.com/doc/en/pgmsascdc/default/pgmsashlp/titlepage.htm
  • Stoltzfus, J. C. (2011). Logistic regression: A brief primer. Academic Emergency Medicine, 18(10), 1099-1104. https://doi.org/10.1111/j.1553-2712.2011.01185.x

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

looti, M. (2026, أغسطس 30). SAS: كيفية استخدام عبارة Datalines لإنشاء مجموعة بيانات. عرب سايكلوجي. https://arabpsychology.com/statistics/sas-how-to-use-datalines-statement-to-create-a-dataset/
looti, Mohammed. “SAS: كيفية استخدام عبارة Datalines لإنشاء مجموعة بيانات.” عرب سايكلوجي, 30 أغسطس 2026, https://arabpsychology.com/statistics/sas-how-to-use-datalines-statement-to-create-a-dataset/.
looti, Mohammed. “SAS: كيفية استخدام عبارة Datalines لإنشاء مجموعة بيانات.” عرب سايكلوجي. أغسطس 30, 2026. https://arabpsychology.com/statistics/sas-how-to-use-datalines-statement-to-create-a-dataset/.