BookmarkSubscribeRSS Feed
Hagay
SAS Employee

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

 

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

 

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

 

לא נצלול יותר מידי לעומק בנושא ייצוג הקסדצימלי (בסיס 16), גם כי אין זה ומקום וגם כי זה לא ממש נדרש, אבל נציין בקצרה שכמו שייצוג בינרי מכיל שני תווים (0 ו – 1), וייצוג דצימלי מכיל עשרה תווים (0 עד 9) ייצוג הקסדצימלי  מכיל 16 תווים (0 עד 9 ו – A עד F). היתרון בייצוג הזה שכל תו במחרוזת שלנו מוצג כזוג תווים הקסדצימליים כולל התווים הנסתרים שלנו. לדוגמא:

data TEST; * Creating some sample data. Forget you saw this;
	length 
		CHAR_VAR	$10;
	char_var="string";
	output;
	char_var=cats("string", '09'x);
	output;
run;

proc sql noprint;
	create table TEST1 as 
	select * 
	from TEST
	where lowcase(strip(char_var))='string'; * Only getting one row. WHY!!!!;
quit;

data TEST_HEX;
	set TEST;
	length 
		char_var_hex	$20;
	char_var_hex=put(char_var, $hex20.); * Now we can see why;
run;

בדוגמא למשל 76 זה הייצוג של התו "s" בהקסדצימלי, 74 זה התו "t", 20 זה רווח וכך הלאה.

 

עכשיו ניתן לראות בקלות שהשורה השנייה שלנו מכילה תו נוסף – 09 בהקסדצימלי (תו ה – TAB) והוא זה שיוצר לנו את הבעיות.

איך נפטרים מהתווים הללו אחרי שראינו שפונקציית ה – strip לא עוזרת? בעזרת compress:

proc sql noprint;
	create table TEST2 as 
	select * 
	from TEST
	where compress(char_var,, 'okw')='string'; * Job done;
quit;

התווים עדיין נסתרים אבל עכשיו לפחות אנחנו מבינים מה הבעיה ויודעים איך לפתור אותה.

חגי