הבלוג של גרי רשף

23/08/2011

הסרת תווים מיותרים

Filed under: Uncategorized — גרי רשף @ 21:11

יש לנו טקסט אותו אנחנו רוצים לנקות מתווים מיותרים כמו #\|&^ וכו' או להשאיר רק תווים אלפה-נומריים.

נתחיל מהאופציה השלילית- הסרת תווים מיותרים: הפתרון המסורבל הוא כדלקמן:

Declare @S Varchar(Max);
--"מחרוזת טכנית לדוגמה שכוללת הרבה "לכלוך
Select  @S='abc d1,$ 23A-B`CD''א]ב%ג[דה';
Select  @S=Replace(@S,' ',''), --רווח
        @S=Replace(@S,',',''),
        @S=Replace(@S,'$',''),
        @S=Replace(@S,' ',''), --{TAB}
        @S=Replace(@S,'-',''),
        @S=Replace(@S,'`',''),
        @S=Replace(@S,'''',''), --גרש יש להכפיל
        @S=Replace(@S,']',''),
        @S=Replace(@S,'%',''),
        @S=Replace(@S,'[','');
Select @S;

clip_image002

אפשר לשים לב לתופעה מעניינת: פקודת ה-Replace פועלות בטור – זו אחר זו – למרות שכולן באותו Select ואמורות להתבצע במקביל ולבטל זו את זו. הפתרון הזה אינו מוצלח מכיוון שכל הוספה או גריעה של תו מהרשימה מחייבת לתקן את הקוד, ובהנחה שקוד זה הוא חלק מפרוצדורה או פונקציה – זה לא רצוי וגם הופך אותו לשימושי רק בחלק מהמקרים. היה ראוי לקבל את בתווים למחיקה במחרוזת, למשל כך-

Declare @S Varchar(Max),
        @No Varchar(Max);
Select  @S='abc d1,$ 23A-B`CD''à]á%â[ãä', --"מחרוזת טכנית לדוגמה שכוללת הרבה "לכלוך
        @No='-` ~!@#$%^&*()_=+{},<.>/[?{}\|;:'']';
While @No<>''
    Select  @S=Replace(@S,Left(@No,1),''),
            @No=Stuff(@No,1,1,'');
Select @S;

clip_image004

פתרון שאינו כולל שימוש בלולאה- כנראה שאין, ולכן אם נרצה "לנקות" עמודה בטבלה – נצטרך לבנות פונקציה ולהשתמש בה.

מה עם האופציה החיובית?

Declare @S Varchar(Max),
        @Yes Varchar(Max);
Select  @S='abc d1,$ 23A-B`CD''à]á%â[ãä', --"מחרוזת טכנית לדוגמה שכוללת הרבה "לכלוך
        @Yes='0-9a-zA-Zא-ת';
While PatIndex('%[^'+@Yes+']%',@S)>0
        Set @S=Stuff(@S,PatIndex('%[^'+@Yes+']%',@S),1,'');
Select  @S;

clip_image006

הלולאה מזהה בעזרת PatIndex תווים שאינם בתחומים המוגדרים על ידי @Yes, ומחליפה אותם במחרוזת ריקה (בעזרת הפונקציה Stuff). הפונקציה PatIndex היא פונקציה חזקה מאוד, אבל יש לה כמה בעיות עם תווים שהם משמעותיים מבחינתה:

מקף (-) יש למקם בתחילת המחרוזת, אחרת הוא מציין תחום (מ.. עד ..).

גג (^) אין למקם בתחילת המחרוזת כי הוא מציין שלילה (כל מה שאינו..).

סוגרים מרובעים ([]) לא הצלחתי למצוא דרך להשתמש בסוגר הימני ([) כחלק ממחרוזת כמו בדוגמה הנ"ל. אם מישהו ימצא – אשמח מאוד.

כפי שציינתי- יש לשלב את הקודים הנ"ל בפונקציה כדי להפעיל אותה על טבלה. למשל-

Create Function dbo.F_Nikayon(@S Varchar(Max),
                            @Yes Varchar(Max))
Returns Varchar(Max) As
Begin
While PatIndex('%[^'+@Yes+']%',@S)>0
      Set @S=Stuff(@S,PatIndex('%[^'+@Yes+']%',@S),1,'');
Return (@S);
End
Go

Select  name,
        dbo.F_Nikayon(name,'0-9a-zA-Zא-ת')
From    sys.objects;

clip_image008

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

מודעות פרסומת

2 תגובות »

  1. […] בTSQL שהתפרסם לאחרונה עודד אותי לפרסם תגובה עקיפה בפוסט הסרת תווים מיותרים בו הצעתי דרך טובה יותר (לטעמי) לבצע מטלה מקדימה שלו, […]

    פינגבאק של חיתוך בין רשימות - גרי רשף — 24/08/2011 @ 20:39

  2. […] בTSQL שהתפרסם לאחרונה עודד אותי לפרסם תגובה עקיפה בפוסט הסרת תווים מיותרים בו הצעתי דרך טובה יותר (לטעמי) לבצע מטלה מקדימה שלו, […]

    פינגבאק של חיתוך בין רשימות « הבלוג של גרי רשף — 24/08/2011 @ 19:28


RSS feed for comments on this post. TrackBack URI

להשאיר תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s

בלוג בוורדפרס.קום.

%d בלוגרים אהבו את זה: