BookmarkSubscribeRSS Feed
Hagay
SAS Employee

שלום,

 

יש פונקציות ב – SAS שהשם שלהן מרמז בצורה די ברורה על התפקיד שלהן. אם קוראים לפונקציה SUM די ברור מה היכולות שלה ומתי אנחנו יכולים להשתמש בה. יש גם לא מעט פונקציות שהשם שלהן ממש מסתורי כמו INTNX וחברתה INTCK שנדבר עליהן בעתיד. אבל בין שתי הקיצוניות הללו ישנן פונקציות שהשמות שלהן נשמעים די פשוטים אבל עדיין קצת קשה לנחש מה היכולות שלהן ומתי כדאי להשתמש בהן. אחת מאלו היא SCAN.

התיעוד של SAS מתאר אותה במשפט אחד (תרגום קלוקל לעברית שלי) – "מחזירה את המילה ה – n ממחרוזת תווים". כמו שראינו בעבר, דוגמא אחת שווה אלף מילות תיעוד:

data _null_;
	x="משפט ארוך עם כמה מילים";
	y=scan(x, 2);
	put y=;
run;

נכון, זה נראה סבבה אבל זה רק מגרד את היכולות של הפונקציה הזו. הפרמטר השלישי שלה מאפשר לנו להגדיר את התו או התווים אשר מפרידים בין "מילים". ברירת המחדל היא תו הרווח (ועוד כמה תווים שמפורטים בתיעוד) אבל אנחנו יכולים להגדיר אוסף תווים כרצוננו, למשל:

data _null_;
	x="ATR_698769_JHKJHL#JHGKJG";
	y=scan(x, 3, '_#');
	put y=;
run;

 

אבל הקסם האמיתי הוא בפרמטר הרביעי שיכול ממש להקל עלינו את החיים. הוא יכול לקבל מספר קודים המיוצגים ע"י אות בודדת (שוב, מפורטים בתיעוד). חלקם שימושיים יותר וחלקם פחות אבל יש שנים, שלדעתי, הם ממש כוכבים. הראשון הוא "O" (או "o") שיכול לשפר לנו את הביצועים אם אנחנו מפעילים את הפונקציה SCAN על טבלה גדולה והשני הוא הלהיט האמיתי - הוא אומר ל – SCAN לבצע את הסריקה מהסוף להתחלה וכשצריך זה ממש שימושי, למשל:

data FILES;
	length 
		File_Path	$256
		Filename	$64;
	input file_path;
	filename=scan(file_path, 1, '/\', 'OB');
datalines;
C:\folder\sub_folder\file1.sas
D:\folder\file2.sas
/sasdata/directory/linux_file.sh
/sasdata/dir/dir2/another_linux_file.sh
;
run;

כן, אפשר לשלב כמה ערכים עבור הפרמטר הרביעי כדי לקבל בדיוק מה שאנחנו רוצים.

 

חגי

 

4 REPLIES 4
Shmuel
Garnet | Level 18

בדוגמה הבאה מתבצעת סריקה לאחור, ללא שימוש בפרמטר הרביעי,

אז מה היתרון בשימוש בפרמטר הרביעי B ? 

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

data FILES;
	length 
		File_Path	$256
		Filename	$64;
	input file_path;
	*filename=scan(file_path, 1, '/\', 'OB');
	filename=scan(file_path, -1, '/\');
datalines;
C:\folder\sub_folder\file1.sas
D:\folder\file2.sas
/sasdata/directory/linux_file.sh
/sasdata/dir/dir2/another_linux_file.sh
;run;
Hagay
SAS Employee

שלום שמואל,

 

אין יתרון או חסרון מיוחד - כמו רוב הדברים ב - SAS - יש כמה דרכים לבצע כל משימה.

 

יש הבדל קטן בין השיטות - השימוש B תמיד יסרוק מימין לשמאל ללא קשר לסימן של הפרמטר השני - אבל ברוב המקרים הן משיגות אותה תוצאה.

 

חגי

Shmuel
Garnet | Level 18

מבדיקה, כאשר הפרמטר הרביעי = "B" אכן מתבצת סריקה לאחור ללא תלות בסימן הפרמטר השני, אולם עושה רושם שהפרמטר הרביעי מחייב הגדרת פרמטר שלישי באופן מפורש וברירת המחדל אינה פועלת נכון.

להלן לוג ניסוי שעשיתי:

1          OPTIONS NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK;
 72         
 73         data _null_;
 74           txt = "a b c d e f";
 75           c1= scan(txt,5);
 76           c2 = scan(txt,-3);
 77           c3 = scan(txt,3,' ','B');
 78           c4 = scan(txt,3,,'B');
 79           c5 = scan(txt,-3,,'B');
 80           c6 = scan(txt,-3,' ','B');
 81           put c1= c2= c3= c4= c5= c6=;
 82         run;
 
 c1=e c2=d c3=d c4=  c5=  c6=d
 NOTE: DATA statement used (Total process time):

 

EyalGonen
Barite | Level 11

בהקשר הזה ראוי לציין שגם אם משתמשים בפונקציה SCAN על טקסט בעברית לוגית Logical Hebrew, שזו עברית שכולם משתמשים בה בסביבת Windows, אז למרות שהטקסט מוצג מימין לשמאל הסריקה משמאל לימין וזה תקין לחלוטין ועובד נכון. בדוגמה להלן הפונקציה SCAN תחזיר את המילה "בוקר" למרות שבתצוגה היא המילה הימנית ולכאורה הפונקציה אמורה להחזיר את המילה הראשונה משמאל. כפי שאתם רואים זה עובד תקין כי באמת המילה "בוקר" היא אכן המילה השמאלית בשדה text רק שהיא מוצגת בצד ימין! במילים אחרות סדר הכתיבה וסדר התצוגה שונים.

 

מי מאיתנו שכותבים ועובדים עם עברית ויזואלית Visual Hebrew, בעיקר מדובר על כאלה שעובדים אך ורק במערכות הפעלה Unix/Linux ללא תצוגה של פלטים על תחנות Windows, אז דווקא הפונקציה תחזיר את המילה "לכולם" כי במקרה זה סדר הכתיבה וסדר התצוגה זהים ולכן באמת המילה השמאלית היא "לכולם.

 

לסיכום הפונקציה SCAN תמיד עובדת משמאל לימין השאלה היא רק מה כתוב בצד שמאל...

 

data _null_;
	text = "בוקר טוב לכולם";
	fword = scan(text, 1);
	put fword=;
run;