נתונים טקסטואליים שיעור מס' 5: משתני טקסט נתונים טקסטואליים מופיעים בהקשרים הבאים: נתונים לתוכנית. לדוגמא: שמות אנשים, ערים, מוצרים וכו' וכן טקסטים שלמים למשל ספרים. שמות בקוד עצמו. לדוגמא: שמות משתנים, קבצים. אנוטציה בגרפיקה: כותרות לצירים ולגרף, מקרא, טקסט חופשי. מאפיינים שונים לפעולות בתוכנית. לדוגמא: סימונים לצבעים ולסגנון קו בגרפיקה )פקודת,)plot פורמט כתיבה לקובץ גרפי )פקודת,)print וכן פקודות שנראה בהמשך שיעור זה. מהם תווים ומחרוזות תווים תו הוא יחידת-מידע שמתייחסת לסימן גרפי. דוגמה פשוטה לתו היא אחת מאותיות האלפבית. תווים כוללים גם את סימני הספרות, סימני פיסוק, סימנים מיוחדים )למשל @ או $(, וכן סימן רווח. תווי-בקרה הם תווים שאינם ניתנים לקריאה אבל מסמנים הוראות להצגה של תווים אחרים, לדוגמא: מעבר לשורה חדשה, קפיצה )סימן טאב(, חזרה אחורה מקום אחד ועוד. במחשב תווים מיוצגים ע"י קודים, שהם ערכים מספריים. ההתאמה בין התווים לקודים שלהם נקראת קידוד. קיימות כיום מערכות קידוד רבות, ביניהן קוד UTF8,ascii ועוד. בגירסאות מוקדמות של מטלב הוכר רק קידוד.ascii כיום ניתן לעבוד עם כל קידוד המוכר ע"י המערכת, כאשר ניתן גם לשנות את ברירת המחדל לקידוד. מחרוזת תווים היא שורה מסודרת של תווים. דוגמא פשוטה היא שורת-טקסט. במטלב מחרוזת תווים היא מערך חד-ממדי של תווים. )במטלב ניתן ליצור גם מערכי תווים רב-ממדיים(. מטלב מציין קבועי-מחרוזת )מחרוזות שהן חלק מן התוכנית עצמה( בצבע ייחודי. עבודה עם משתני טקסט יצירת מחרוזות בדומה לנתונים מספריים, אפשרות אחת ליצירת משתני מחרוזת היא קריאה מקובץ )על כך בהמשך(. ליצירת מחרוזות בתוך התוכנית, הצורה הנפוצה ביותר היא ע"י כתיבת האותיות בין גרשיים. ליצירת תו בודד: ליצירת מחרוזת: mychar = '!' mychar =! mysay = 'This is a string' mysay = This is a string שיעור 5 עמ' 1 מתוך 11
char(80) P יצירת תו מתוך הקידוד שלו יצירת מחרוזת מתוך סדרת קודים יצירת מחרוזת של n תווי רווח המרה ממספר למחרוזת, כלומר: מחרוזת התווים שמייצגת באופן קריא את המספר לכלול לא יותר מ- n ספרות משמעותיות: המרה למחרוזת של החלק השלם בלבד של מספר )החלק השברי מושמט( פעולות-מערך על מחרוזות char(40:50) ()*+,-./012 blanks(n) num2str(x) num2str(x,n) int2str(x) מאחר שמחרוזות הן מערכים, כל הפעולות המוגדרות במטלב על מערכים מוגדרות גם על מחרוזות. למשל שרשור: כך יש לבנות טקסט להצגת מספר: שליפת חלק ממחרוזת: ניתן ליצור גם מערכי תווים דו-ממדיים, אבל רק אם כל המחרוזות באותו אורך. )אם לא, ניתן "לרפד" את המחרוזות הקצרות יותר ברווחים. צורת עבודה זו פחות נוחה ובהמשך נכיר סוגי משתנים שמתאימים יותר לעבודות עם קבוצות של מחרוזות(. yoursay = [mysay mychar] yoursay = This is a string! x = 3.5; msg = ['The value of x is: ' num2str(x)] msg = The value of x is: 3.5 yoursay(3:7) is is names=['ruthi';'moshe';'avram';'dana '] names = Ruthi Moshe Avram Dana דוגמא 1: שרשרת DNA בנויה משני "גדילים" המחוברים ביניהם לאורכם. כל "גדיל" בנוי מסדרה של בסיסים שמסומנים באותיות.G,A,T,C הגדילים מאורגנים כך שמול הבסיס G בגדיל אחד נמצא הבסיס DNA מייצג שרשרת d5pairs הסקריפט A. נמצא T ומול T נמצא A מול G, נמצא C בגדיל שני, מול C באורך n ע"י שתי שורות של אותיות )כל "גדיל" בשורה( כלומר מערך.2xn את השורה הראשונה "מגרילים" באופן אקראי, ואת השורה השנייה בונים בהתאם לשורה הראשונה. שיעור 5 עמ' 2 מתוך 11
פקודות לטיפול במחרוזות קיימות פקודות רבות לטיפול במחרוזות. לרשימה מלאה, יש לחפש בתיעוד לפי.strings להלן כמה מן הפקודות השכיחות: strtrim(strng) הסרת כל הרווחים לפני הסימן הראשון ואחרי הסימן האחרון שאינם רווחים. )משאירה רווחים בין הסימנים שאינם רווחים(. str2double('5.1e-3') המרה ממחרוזת למספר אחד. אם המחרוזת לא מצייגת מספר, מתקבל.NaN 0.0051 str2num(strng) strfind(strall,substr) strfind(mysay,'is') 3 6 strcmp(str1,str2) המרה ממחרוזת למספר/ים )יכול לפענח גם סדרה של מספרים(. חיפוש מחרוזת substr בתוך מחרוזת אחרת.strall אם נמצא, מתקבל האינדקס בתוך strall שבו נמצא התו הראשון של.substr )אם יותר מפעם אחת, מתקבל מערך של אינדקסים(. השוואה בין שתי מחרוזות. מתקבל true אם שתי המחרוזות זהות, false אחרת. שאלה: מדוע לא מספיקה השוואה == ויש להשתמש בפקודת?strcmp עבודה עם קבצים קובץ הוא אוסף של נתונים שהמערכת מתייחסת אליו כאל יחידה אחת. לקובץ מספר מאפיינים, לדוגמא: שם הקובץ תוכן הקובץ - המידע הנמצא על אמצעי האכסון. גודל הקובץ - מס' הבתים שתופס באמצעי-האכסון. תאריכים )יצירה, שינוי(. הרשאות )אילו משתמשים רשאים לעשות בו פעולות שונות(. מידע על מיקום הקובץ באמצעי האכסון: מידע זה שקוף למשתמש, ונמצא בניהול המערכת. תיקייה היא סוג מיוחד של קובץ, שכולל מידע על קבצים אחרים. קבצים אלה שייכים לתיקייה )נמצאים בתוכה(. חלק מן הקבצים יכול להיות תיקיות. קיים סימון של המערכת ל"שיוך" של קובץ לתיקייה: הסימן \ במערכת Windows והסימן / במערכת C, נמצא ברמה העליונה של דיסק פירושו שהתיקייה lib1 c:\lib1\lib2\myfile.txt לדוגמא.Linux התיקייה lib2 נמצאת בתיקייה lib1 והקובץ myfile.txt נמצא בתיקייה.lib2 path הוא ה"מסלול" שמוביל מהרמה העליונה של אמצעי האכסון לתיקייה שבה נמצא קובץ, במקרה שלמעלה c:\lib1\lib2 שם מלא של קובץ כולל גם את השם וגם את ה- path, כלומר c:\lib1\lib2\myfile.txt שיעור 5 עמ' 1 מתוך 11
פקודות מערכת לטיפול בקבצים לרשימה המלאה של פקודות לטיפול בקבצים, יש לחפש files בתיעוד. להלן כמה פקודות שימושיות. הארגומנטים של קלט ו/או פלט בכל הפקודות הבאות הם מחרוזות תוים )שמות של קבצים(: ה- path המלא לתיקייה בה נמצאים. מעבר לתיקייה.mydir אם אין path מלא, מטלב מחפש את mydir תחת התיקייה הקיימת. מחיקת קובץ myfile העתקת קובץ ffrom לקובץ fto בניית שם מלא של קובץ מחלקיו, תוך הכנסת סימן התיקייה pwd cd mydir delete myfile copyfile ffrom fto fullfile fdir fname fullfile data-files pictures pic1.png data-files\pictures\pic1.png המתאים למערכת,Windows( Linux וכו'(. לדוגמא: פורמט פונקציה לעומת פורמט פקודה במטלב אפשר לכתוב פקודות בשתי צורות: פורמט פקודה הארגומנטים מפוענחים כטקסט command arg1 arg2 לא מתקבל פלט שניתן לשמור במשתנה. שמות ספציפיים הם חלק מן הפקודה. פורמט פונקציה command(arg1,arg2) save results.txt alltab -ascii תמיד יווצר קובץ בשם results.txt תמיד יווצר משתנה בשם acid.txt מה שלא מוגדר בין גרשיים, מפוענח כקלט רגיל: אותיות כשמות משתנים, מספרים כמספרים. פלט יתקבל לפי הגדרת הפקודה. מאפשר גמישות כאשר שמות ניתנים ע"י משתני מחרוזת. save(myfile,'alltab','-ascii') המשתנה alltab ייכתב לקובץ ששמו הוא המחרוזת במשנה.myfile spectra = load(myfile) ייקרא תוכנו של הקובץ ששמו הוא המחרוזת שבמשתנה.myfile load acid.txt print myplot.pdf -dpdf תמיד יווצר קובץ בשם.myplot.pdf מעבר לתיקייה.mydir אחרי הקריאה הנתונים נשמרים במשתנה.spectra print(myplot,'-dpdf') הפלוט יישמר בפורמט PDF בקובץ ששמו הוא המחרוזת שבמשתנה.myplot cd(mydir) מעבר לתיקייה ששמה הוא המחרוזת שבמשתנה.mydir cd mydir copyfile a.txt b.txt תמיד יועתק קובץ a.txt לקובץ.b.txt copyfile(file_a,file_b) הקובץ ששמו הוא המחרוזת במשתנה file_a יועתק לקובץ ששמו הוא המחרוזת במשתנה.file_b שיעור 5 עמ' 4 מתוך 11
בחירת קובץ מתוך רשימה הפקודות הבאות מציגות למשתמש רשימה של קבצים לפי קריטריון מסוים,)pattern( ועוצרות את התוכנית עד שהמשתמש בוחר באמצעות העכבר את אחד הקבצים. המשתמש יכול לעבור לתיקיות אחרות, גם כאלה שנמצאות מעל לתיקייה הנוכחית. מתקבל שם-קובץ )אותו אפשר לשמור במשתנה מחרוזת(. בחירת קובץ לקריאה: יש לבחור שם קובץ קיים. uigetfile(pattern,title) [FName,PName] = בחירת קובץ לשמירה: ניתן לבחור שם קיים או uiputfile(pattern,title) [FName,PName] = להזין שם שאינו קיים. Pname = uigetdir(start_path,title) בחירת תיקייה: בכל הפקודות האלה: FName שם קובץ )ללא.)path PName שם של תיקייה, בצורת path מלא. תבנית לבחירה, בדרך כלל בשילוב * המסמן תווים כלשהם. pattern כדי לאפשר בחירת קובץ כלשהו בתיקייה כלשהי, יש לציין *.* title כותרת, טקסט על פס-הכותרת של חלונית הבחירה. ניתן להשמיט title ואז תופיע כותרת ברירת-מחדל. ניתן להשמיט Pname ואז ידוע רק שם הקובץ )לא מומלץ, מאחר שאין לצפות את תגובת המשתמש(. דוגמא 2: הסקריפט d5plot_neuron_step מבצע את הדברים הבאים: א. נותן למשתמש לבחור קובץ מתוך רשימת קבצי.neuron_step*.mat ב. קורא את הקובץ, ומשרטט את המתח כפונקציה של הזמן. ג. מוצא את נקודת המקסימום ומוסיף על הגרף ליד נקודה זו את ערכי הזמן והמתח. ד. מוצא את עצמת הזרם וכותב את ערכה ככותרת לגרף. ה. מצייר קו מרוסק בנקודת הזמן שהזרם מפסיק. ו. שומר את הציור לקובץ, כאשר שם הקובץ כולל את עצמת הזרם וזמן הערור. קלט/פלט קלט מן המשתמש קלט מן המקלדת: פקודת input מציגה מחרוזת תווים,prompt עוצרת את ביצוע התכנית ומאפשרת למשתמש להקיש על המקלדת. לאחר שהמשתמש מקיש על,<ENTER> כל מה שהוקש מהצגת ה- prompt ועד מקש זה, מתקבל כפלט של הפקודה. קיימות שתי צורות לפקודה: resp = input(prompt) קלט מפוענח: מטלב מנסה לפענח את התווים שהוקשו כאילו הוקלדו בחלון הפקודות, והתוצאה נשמרת במשתנה.resp raw = input(prompt.'-') קלט גולמי: התווים מועברים למשתנה raw כפי שהוקשו. שיעור 5 עמ' 5 מתוך 11
בחירת אפשרות מתוך תפריט: פקודת menu מציגה חלונית עם עמודה של כפתורים, עוצרת את ביצוע התוכנית ומאפשרת למשתמש להקיש על אחד מן הכפתורים עם העכבר. הפלט n של הפקודה הוא המספר הסידורי של הכפתור עליו הוקש. n = menu(title,b1,b2,...,bn) אופן השימוש בפקודה: title כותרת, טקסט שיופיע מעל עמודת הכפתורים. b1, b2,...bn מחרוזות טקסט, כל אחת תווית על כפתור בתפריט. דוגמא 3: הסקריפט d5births מבצע את הדברים הבאים: א. קורא נתוני לידות מקובץ ומציג כפונקציה של הזמן את נתוני כל החודשים. ב. נותן למשתמש לבחור עמודה, צבע ומרקר. ג. חוזר על הבחירה עבור חודש נוסף. ד. מנקה את הפלוט, מצייר רק את נתוני שני החודשים שנבחרו, עם הצבעים והמרקרים שנבחרו, ומציג מקרא. קלט/פלט מפורש עד כה הכרנו פקודות שמבצעות קלט/פלט על קובץ שלם, בצורה שקופה לתוכנית. הפקודות בהמשך מאפשרות לקרוא או לכתוב לקובץ בשלבים. כל קובץ מסתיים בסימן end-of-file המציין למערכת את קצה הנתונים בקובץ. )זה אינו מספר או אחד מן הסימנים האפשריים כחלק מן הנתונים(. בכל רגע נתון בטיפול בקובץ, המערכת קוראת או כותבת למקום מסוים בקובץ. המערכת עוקבת אחרי מקום זה באמצעות ה- pointer.file בדרך כלל, פעולת כתיבה או קריאה בודדת לא מתבצעת ישירות לאמצעי-האכסון, אלא ל"חוצץ" :)buffer( אזור שבו המערכת מכינה את הנתונים הנקראים/נכתבים לקובץ. במטלב פעולה זו שקופה למשתמש. הליך קריאה או כתיבה לקובץ כולל את השלבים הבאים: פתיחת הקובץ: מציאת הקובץ לפי שם מלא, איסוף מידע )מקום פיסי של הקובץ ומאפיינים נוספים(, הקצאת ה- buffer, הצבת ה- pointer file בהתחלת הקובץ. כל המידע הזה שקוף למשתמש, וניתן לגשת לקובץ רק ע"י מציין File-ID שמצביע על אוסף המידע שהמערכת שומרת לגבי הקובץ בכל זמן עיבודו. כתיבה או קריאה לקובץ )אפשר יותר מפעולה אחת(. סגירת הקובץ: כתיבת ה- buffer לאמצעי האכסון, כתיבת end-of-file )אם רלוונטי(. תוכנית שמשתמשת בקלט/פלט מפורש כוללת פקודות המבצעות את השלבים האלה. הפקודות לפתיחה וסגירה של קובץ הן: שיעור 5 עמ' 6 מתוך 11
fid = fopen(filename, action) פתיחת קובץ: fid מציין לקובץ )להתייחסות בהמשך( filename שם הקובץ action הפעולה/ות לביצוע בקובץ אפשרויות עבור :action 'r' קריאה )ברירת מחדל( 'w' כתיבה )גם על קובץ קיים( 'a' הוספה לקובץ קיים )אם יש( אפשרויות נוספות מפורטות בתיעוד של הפקודה. fclose(fid) סגירת קובץ: סגירת כל הקבצים הפתוחים: fclose('all') קלט/פלט מקבצי טקסט קבצי טקסט כוללים רק קודים של תווים. למרות שהקבצים מוצגים "בצורה דו ממדית" כלומר כאוסף של שורות זו מתחת לזו, כל קובץ הוא סדרה אחת של תווים. השורות מופרדות ביניהן בקובץ ע"י סימן 'n\'. שמצויין בתוכנית מטלב ע"י newline הערה: בטיפול בקבצי טקסט במערכת,Windows לפעמים יש להוסיף מציין 't' ל- action בפקודת fopen לקובץ טקסט כדי שתוכנת NotePad תקרא את הקובץ כהלכה. לדוגמא, במקום 'r' לכתוב.'rt' )בקבצי טקסט ב- Windows יש '\n\r' כלומר גם חזרה לראשית השורה במקום רק 'n\' כלומר מעבר לשורה חדשה(. קריאה של שורת טקסט strng = fgetl(fid) קריאת מחרוזת תווים מהמקום הנוכחי בקובץ ועד סוף השורה. strng אם נקראו תווים: מחרוזת תווים )לאחר קידוד אך ללא פענוח תוכן(. אם לא נשארו תווים עד סוף הקובץ: מספר = 1-. קריאה וכתיבה של טקסט לפי פורמט הפורמט מציין את אופן ההמרה בין ייצוג פנימי )בינארי( של משתנים במטלב לטקסט קריא )מחרוזות תווים(. פקודת format במטלב שהכרנו בשיעורים קודמים מגדירה כמה צורות המרה נתונות, לצורך הצגה בחלון הפקודות. קלט/פלט מפורש מאפשר ציון מגוון רחב יותר של פורמטים. פורמט במטלב הוא מחרוזת תווים. המחרוזת יכולה לכלול "תווים חופשיים" אשר לא מתפענחים )נקראים או נכתבים כפי שהם מופיעים בפורמט(, וכן "שדות" שכל אחד מהם מגדיר צורת המרה לגודל סקלרי )מספר או מחרוזת( אחד. בתוך הפורמט, מזהים את התחלת השדה בסימן % ואת סוף השדה לפי קוד ההמרה. כמו-כן אפשר לציין את רוחב השדה w שהוא מספר התווים שהשדה יתפוס לאחר המרה, וכן מאפיינים נוספים הרלוונטיים לכל סוג. במידה ורוחב השדה עולה על מספר התווים הנוצרים מן ההמרה, התווים מיושרים לימין ו"מרופדים" בתווי רווח משמאל. שיעור 5 עמ' 7 מתוך 11
fprintf(fid,format,a1,...,an) %c %s %ws %d %wd %0wd %f %w.pf %0w.pf %e %w.pe %0w.pe להלן כמה סוגי שדות ומאפיינים נפוצים: תו בודד מחרוזת תווים רוחב שדה w מספר )עשרוני( שלם רוחב שדה w "ריפוד" באפסים במקום בתווי רווח. מספר עשרוני עם נקודה קבועה. רוחב שדה w, מתוכו p ספרות אחרי הנקודה "ריפוד" באפסים במקום בתווי רווח. מספר עשרוני עם נקודה צפה. רוחב שדה w, מתוכו p ספרות אחרי הנקודה "ריפוד" באפסים במקום בתווי רווח. כתיבה ע"י פורמט הפקודה לכתיבה לקובץ היא: fid מציין לקובץ. אם מושמט, הפלט נכתב לחלון הפקודות. format מחרוזת הפורמט A1,A2,...An ערכים להמרה. יכולים להיות ביטויים כלשהם )לא רק שמות משתנים(. מטלב עובר על כל הערכים במשתנים )לפי הסדר שבו הם מופיעים בפקודה( ובהתאמה על כל השדות שבפורמט. כל ערך מומר בהתאם למאפייני השדה המתאים בפורמט. אם משתנה הוא מערך, אז קודם ממירים את כל האיברים שלו ורק אז עוברים למשתנה הבא. במקרה של מערך עם 2 ממדים או יותר, עוברים על כל האברים בסדר שבו הם נמצאים בזיכרון - לפי עמודות. אם השדות בפורמט "נגמרים" לפני שהומרו כל הערכים שבמשתנים, מטלב עושה בפורמט "שימוש חוזר". לדוגמא: fmt = ' Col < %5.3f %5.1e %5.2f >\n'; fprintf(fmt,rnd) rnd = rand(3,4) rnd = Col < 0.957 4.9e-01 0.80 > 0.9572 0.1419 0.7922 0.0357 Col < 0.142 4.2e-01 0.92 > 0.4854 0.4218 0.9595 0.8491 Col < 0.792 9.6e-01 0.66 > Col < 0.036 8.5e-01 0.93 > 0.8003 0.9157 0.6557 0.9340 שיעור 5 עמ' 8 מתוך 11
קריאה ע"י פורמט ניתן לקרוא רק משתנה אחד. אם כל הנתונים בקובץ מאותו סוג, ניתן לקרוא מערך בפקודה אחת. A = fscanf(fid,format) הנתונים שנקראו מהקובץ נשמרים במשתנה A. A = fscanf(fileid, format, sa) ציון מספר האיברים )לכל היותר( לקריאה. A = fscanf(fileid, format, [m,n]) ציון הממדים של m A: שורות, n עמודות. אם n=inf אז קוראים עד סוף הקובץ. במקרה שהפורמט כולל תווים מפורשים, מטלב מחפש את התווים האלה בקובץ, מדלג עליהם וממשיך לפענח את הקובץ לפי השדה שאחרי התווים. דוגמא 4: הסקריפט d5write_neuron_step מבצע את הדברים הבאים: א. נותן למשתמש לבחור קובץ מתוך רשימת קבצי.neuron_step*.mat ב. קורא את הקובץ, ומוצא את עצמת הזרם וזמן הערור. ג. מכין שם-קובץ כולל את עצמת הזרם וזמן הערור, עם סיומת.txt ד. כותב לקובץ בשם זה שורת כותרת עם עוצמת הזרם וזמן הערור. ה. בהמשך הקובץ, כותב כותרות לזמן ולמתח, ומתחתיהן את ערכי הזמן והמתח. דוגמא 5: הסקריפט d5read_neuron_step מבצע את הדברים הבאים: א. נותן למשתמש לבחור קובץ מתוך רשימת קבצי.neuron_step*.txt ב. פותח את הקובץ לקריאה, ומדלג על השורה הראשונה. ג. מן השורה השנייה והשלישית, מחלץ את ערכי הזרם וזמן הערור. ד. מדלג על שורת הכותרת לעמודות. ה. קורא את העמודות ומכין מהן משתנה לזמן ומשתנה למתח. ו. משרטט גרף של המתח כפונקציה של הזמן. ז. מוסיף כותרת לגרף: שם הקובץ המקורי + ערכי הזרם וזמן הערור. קריאה וכתיבה לקבצים בינאריים קובץ בינארי כולל ייצוג בינארי של נתונים מסוגים שונים, באופן סדרתי. בקריאה וכתיבה לקובץ בינארי קוראים בכל פעם נתונים מסוג מסוים. מספר הבתים שנקרא או נכתב עבור כל נתון תלוי בסוג הנתון. להלן כמה סוגי נתונים ומספר הבתים הכתובים בקובץ לכל נתון: סוג מספר בתים מספר בתים סוג single,float 4 int, int32 4 double,float64 8 int16,integer*32 2 char*1 1 int8 1 char תלוי בקידוד uint8 1 סוגים נוספים נמצאים בתיעוד על פקודות.fread,fwrite אם לא מציינים את הסוג בגוף הפקודה, ברירת המחדל היא.uint8 שיעור 5 עמ' 9 מתוך 11
בכתיבה וקריאה של מערך, הנתונים נכנסים למערך לפי עמודות. פקודות כתיבה fwrite(fid, A) כתיבת כל האיברים של A לקובץ. A יכול להיות גם ביטוי )לא רק שם של משתנה(. fwrite(fid, A, dtype) ציון סוג הנתונים dtype fwrite(fid,rand(5),'double') דוגמא: פקודות קריאה A = fread(fid) קריאת כל התוכן של הקובץ למערך-עמודה A. A = fread(fid,sa) ציון מספר הנתונים לקריאה. A = fread(fid,[m,n]) ציון ממדי המערך A )כמו בפקודת.)fscanf A = fread(fid,[m,n],dtype) ציון סוג הנתונים. שיעור 5 עמ' 11 מתוך 11