BookmarkSubscribeRSS Feed
Hagay
SAS Employee

השבוע נדבר קצת על הבייסיק, הבסיס של הבסיס.  סוגי המשתנים ב -  SAS הם, אולי, לא נושא זוהר כמו by group processing או פונקציית ה – LAG אבל הבנה והכרות איתם היא הכרחית לעבודה יעילה ויכולה לחסוך המון גיגול ותסכול.

 

החדשות הטובות הן שהנושא די פשוט - ב - SAS יש רק שני סוגים של משתנים: משתנה מספרי/נומרי המכיל מספר כלשהו ומשתנה תווי המכיל מחרוזת כלשהי (טקסט).

 

נקודה קצרה לפני שנצלול קצת יותר לעומק. ההסבר להלן נכון עבור ה – SAS ה - "קלאסי" שמכונה SAS 9. זו גרסת ה – SAS הנפוצה ביותר ורוב הסיכויים שזו הגרסה שאתם עושים בה שימוש. ישנה גם גרסה מקבילה של תוכנה לעיבוד וניתוח נתונים של חברת SAS הנקראת Viya עם מאפיינים ויכולות שונות מה – SAS ה - "קלאסי" ואחת מהיכולות הללו היא מגוון רחב יותר של סוגי משתנים, דומה יותר למה שאפשר למצוא במערכת בסיס נתונים רלציוני כגון אורקל או SQL Server של מיקרוסופט.

 

בחזרה לענייננו. כאמור משתנה יכול להיות מספרי או תווי אבל מאפיין נוסף הוא האורך או הגודל של המשתנה שמגדיר את טווח הערכים שניתן לשמור בו. משתנה נומרי הוא תמיד 8 (ובכן טכנית משתנה נומרי ב – SAS יכול להיות באורך של בין 3 (או אפילו 2) ל – 8 אבל המלצה שלי, אלא אם אתם באמת יודעים מה אתם עושים, תמיד לבחור 8).

 

משתנה תווי יכול להיות בכל אורך מ - 1, כלומר להכיל תו אחד בלבד, ועד למקסימום של 32,767 תווים. כמובן שתמיד רצוי לבחור את האורך הקטן ביותר עבור משתנה תווי שעדיין יאפשר לנו לשמור את מגוון הערכים שאנחנו צופים שיאוחסנו באותו משתנה.

 

האורך מייצג את מספר הבייטים (bytes) שיוקדשו למשתנה בזיכרון. מי שמעוניין לדעת איך ניתן לשמור מספרים עם יותר משמונה ספרות לפני ואחרי הנקודה העשרונית ב – 8 בייטים בלבד ומתי כל אות יכולה לתפוס אפילו עד 4 בייטים מוזמן לקרוא פה ופה.

 

סוף סוף קצת דוגמא:

data A_TABLE;
	length 
		Numeric_Column	8 /*A numeric variable is just the requested length. Choose 8 or be sorry later*/
		Short_String	$10 /*A character variable is marked with the $ sign before its requested length*/
		Longer_String	$1024;

	* Creating an empty table;
	call missing(of _all_); 
	stop;
run;

אם אתם שואלים, רגע, מה עם תאריכים ב – SAS? אז התשובה היא שתאריכים ב – SAS הם מספרים לכל דבר ולכן נשמרים במשתנים מספריים רגילים. שני דברים מייחדים משתנה מסוג תאריך (או זמן) ב – SAS. הראשון הוא שאנחנו כמשתמשים יודעים שזה משתנה של תאריך ולא סתם מספר והשני הוא תבנית עיצוב מיוחדת בשם format אשר מציגה לנו את המספר בצורה שאנחנו יכולים לזהות כתאריך (למשל 10/05/2020) או זמן (למשל 10:25:43). נמשיך לדון ולהעמיק על תאריכים בהזדמנות אחרת. 

 

מכיוון שיש שני סוגים של משתנים ב –  SAS אך הגיוני שיהיו שתי פונקציות לשם המרת ערכים מסוג אחד לשני. הפונקציה הראשונה היא PUT ובעזרתה ניתן להמיר ערך מספרי לתווי (כלומר יוצרת מחרוזת ממספר) ואילו הפונקציה ההופכית שלה היא INPUT אשר מאפשרת להמיר ערך תווי לנומרי (כלומר יוצרת מספר ממחרוזת). הטריק של שתי הפונקציות הללו הוא הפרמטר השני שהן מקבלות בנוסף לשם של העמודה אותה אנחנו רוצים להמיר. פרמטר זה הוא התבנית המנחה אותן איך לבצע את ההמרה הזו בצורה נכונה. במקרה של פונקציית ה – PUT התבנית הזו מכונה format ואילו עבור פונקציית ה – INPUT התבנית נקראת informat. על שניהן נרחיב את הדיבור בשבוע הבא אבל נסיים בכמה דוגמאות כדי לבנות את המתח:

* Creating a table with some examples values to play with;
data B_TABLE;
	length 
		Num_Column	8 
		Char_Column	$20;
	infile datalines dsd delimiter="," ;
	input num_column char_column;
datalines;
56,
45674.45632,
,0097678
,20/10/2020
;
run;

* Using the table to show some conversions;
data B_TABLE;
	set B_TABLE;
	* Converting numbers to strings - using the PUT function;
	if _n_=1 then char_column=put(num_column, z5.); * Creating a string of five characters with leading zeros as required;
	if _n_=2 then char_column=put(num_column, comma20.2); * Thousand separator and 2 digits after the decimal point. Note the leading spaces;

	* Converting strings to numbers - using the INPUT function;
	if _n_=3 then num_column=input(char_column, 20.); * Simple conversion. Nothing fancy;
	if _n_=4 then num_column=input(char_column, ddmmyy10.); * Converting a date string to a number that represents a date value in SAS;
run;

חגי

hackathon24-white-horiz.png

2025 SAS Hackathon: There is still time!

Good news: We've extended SAS Hackathon registration until Sept. 12, so you still have time to be part of our biggest event yet – our five-year anniversary!

Register Now

Discussion stats
  • 0 replies
  • 1473 views
  • 0 likes
  • 1 in conversation