יום חמישי, 27 בדצמבר 2012

אימות ודאי

במסענו הנמשך בין הפונקציות הנסתרות של SAS הגענו הפעם לפונקציה של SAS עם השם הכי פחות קשור למה שהיא מבצעת - verify.

פונקציה זו מקבלת שני פרמטרים (או יותר, אבל נגיע לזה בהמשך) ומחזירה לנו את המקום של התו הראשון במחרוזת המועברת כפרמטר הראשון שאיננו התו או המחרוזת שהועברו כפרמטר השני.
למעשה, הרבה יותר מסובך להסביר מה הפונקציה הזו עושה מאשר להראות:
data examples;
     length str_before $20;
     input str_before;
datalines;
00000000000000456709
00000000097654090000
97654362000000000000
;
run;

data examples1;
     set examples;
     first_no_0_position=verify(str_before,'0');
first_no_976_position=verify(str_before,'976');
run;

proc print data=examples1;
run;

התוצאה המתקבלת היא:


שימו לב לרשומה השניה. התו הראשון שאיננו אפס הוא תו מספר עשר וזה אכן מה שקיבלנו בעמודה first_no_0_position. קצת מוזר הוא הערך 1 שקיבלנו בעמודה first_no_976_position אבל קריאה חוזרת של פעולת הפונקציה verify תסביר תוצאה משונה זו. התו הראשון במחרוזת שבעמודה str_before שבו לא מתחילה המחרוזת ‘976’ הוא אכן התו הראשון ולכן קיבלנו 1 כתשובה.

עד כה, verify נראית די נחמדה ואפילו עם ניחוח אקזוטי כלשהו אבל לא באמת שימושית. אולם, כאשר נצוות אותה לפונקציה הסלבריטאית substr נוכל להתחיל להבין את השימושיות שלה:

data examples2;
     set examples;
     substr_result=substr(str_before, verify(str_before,'0'));
run;

proc print data=examples2;
run;


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

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

data examples3;
     set examples;
     first_no_0_4_9_position=verify(str_before,'0','4','9');
run;

proc print data=examples3;
run;


verify החזירה לנו את המקום של התו הראשון שהוא לא ‘0’ וגם לא ‘4’ וגם לא ‘9’.

אכן לא צפוי שנשתמש בפונקציה זו בכל יום אבל מידי פעם נתקל במקרים בהם היא תוכל לחסוך לנו זמן ומאמץ וגם להרשים משתמשי SAS אחרים שיקראו את הקוד שלנו...

חגי