استفاده از تابع ()textscan در متلب

چاپ

تابع ()textscan می تواند هر دوی رشته ها و اعداد را در یک مجموعه از داده ها بخواند. اما شما باید برای استفاده از این تابع، از یک سری مشخصه های فرمت دهی استفاده نمایید. علاوه بر آن، شما به سادگی نمی توانید فایل مورد نظر را باز کرده و با آن کار کنید. با در نظر داشتن این الزامات، می توانید گام های زیر را انجام دهید تا به نحوه ی استفاده از تابع ()textscan پی ببرید:

 0. ابتدا فایل NumericData.csv را از اینجا دانلود کنید

 1. عبارت ('FileID = fopen('NumericData.csv را در متلب تایپ کنید و سپس کلید Enter را فشار دهید.

دقت کنید که خود تابع ()textscan قادر نیست تا فایل مورد نظر را برای شما باز کند. بلکه این تابع، یک شناسه را که توسط تابع ()fopen برگردانده شده است، مورد استفاده قرار می دهد. پس متغیر FileId  حاوی آن شناسه ای است که از آن برای دسترسی به فایل خود استفاده خواهیم نمود. 


2. عبارت ('TSOutput = textscan(FileID, '%d,%d,%d/n را در متلب تایپ کنید و کلید Enter را فشار دهید.

 با انجام این کار، شما یک ردیف از داده ها را بعنوان خروجی دریافت خواهید نمود( و نه هر سه ردیف را). بنابراین اکنون زمان آن فرا رسیده است تا از یک حلقه برای خواندن داده ها استفاده کنیم. اما چون هنوز باید مطالب بیشتری را یاد بگیریم، بعدا از حلقه ها استفاده خواهیم نمود.  در این مورد، داده ها در یک آرایه ی سلولی ذخیره می شوند نه در یک ماتریس.

 


 

3. عبارت (feof(FileID را تایپ کنید و سپس کلید Enter را فشار دهید.

این تابع عدد 0 را بعنوان خروجی نشان می دهد. و به این معنی است که هنوز به انتهای فایل مورد نظر نرسیده ایم. ممکن است با خود فکر کرده باشید که چگونه به حلقه اطلاع دهیم تا خواندن اطلاعات را متوقف کند. همان طور که مشاهده می کنید، با استفاده از تابع ()feof به راحتی می توان این مشکل را حل نمود. 

4. عبارت [('TSOutput = [TSOutput; textscan(FileID, '%f,%f,%f/n را تایپ کنید و سپس کلید Enter را فشار دهید. 

اکنون خواهید دید که دومین ردیف از داده ها خوانده می شوند. اما اگر در دستورات بالا به فرمت داده ها،  نگاهی بیاندازید متوجه می شوید که  این سری از اعداد بصورت مقادیر ممیز شناور(float) خوانده شده اند نه بصورت اعداد صحیح.

با استفاده از تابع ()textscan شما می توانید کنترل کاملی بر ظاهر(فرمت) داده های خود داشته باشید. 

 


5. عبارت ({isinteger(TSOutput{1,1 را تایپ کنید و کلید Enter را فشار دهید. 

 خروجی عدد 1 خواهد بود و به ما می گوید که عنصر قرار گرفته در سطر 1 و ستون 1، درواقع یک عدد صحیح است.


6. عبارت ({isinteger(TSOutput{2,1 را تایپ کنید و کلید Enter را فشار دهید. 
این گام مشخص می کند که عنصر قرار گرفته در سطر 2 و ستون 1، یک عدد صحیح نیست. زیرا در خروجی عدد 0 به ما نشان داده می شود. 

این دستور می تواند به شما امکان دهد  تا مطمئن شوید که داده هایی که در متلب دارید، آنگونه که می خواهید هستند یا نه. 


7. عبارت [('TSOutput = [TSOutput; textscan(FileID, '%2s,%2s,%2s/n را تایپ کنید و کلید Enter را فشار دهید. 

این دفعه، داده ها بصورت رشته های تکی خوانده می شوند.


 

8. عبارت ('textscan(FileID, '%d,%d,%d/n را تایپ کنید و کلید Enter را فشار دهید.

این دستور شما را به آخر فایل مورد نظر می برد. و خروجی شامل سلول های خالی است، زیرا چیزی برای خواندن نمانده است. 


9. عبارت (feof(FileID را تایپ کنید و کلید Enter را فشار دهید.

این دفعه، مقدار خروجی 1 است، و به این معنی است که شما به آخر فایل مورد نظر رسیده اید.


10. عبارت (fclose(FileID را تایپ کنید و سپس کلید Enter را فشار دهید.

متلب فایل مورد نظر را می بندد. 


اخطار: در صورتی که یک فایل را به درستی نبندیم، باعث می شود که حافظه به هدر برود و مشکلاتی پیش بیایند. نبستن یک فایل، به احتمال زیاد باعث می شود دسترسی به داده ها با مشکل مواجه شود و یا سیستم خراب شود. نکته این است که نباید پس از استفاده کردن از یک فایل باز شده(در متلب)، آن را به حال خود رها کنیم. بلکه باید با استفاده از دستورات آن را ببندیم. 

اکنون که با نحوه ی کار کردن تابع ()textscan آشنایی پیدا کرده اید، زمان آن رسیده است تا یک برنامه را مشاهده کنید که از آن استفاده می کند. لیست 11.1 نحوه ی اجرای فرآیند های قبلی(بالای این مقاله) را در قالب یک تابع به شما نشان می دهد. شما می توانید تابع  UseTextscan.m را از اینجا دانلود کنید

تابع:

function [ ] = UseTextscan( )

    FileID = fopen('NumericData.csv');
    TSOutput = textscan(FileID, '%d,%d,%d/n');
    
    while not(feof(FileID))
        TempData = textscan(FileID, '%d,%d,%d/n');
        
        if feof(FileID)
            break;
        end
            
        TSOutput = [TSOutput; TempData];
    end
    
    disp(TSOutput);
    fclose(FileID);
    
end

در تمرین های بالا، با بیشتر این کدها آشنایی پیدا کردید، و حالا تمامی آنها را یکجا مشاهده می کنید. در کدهای بالا، شما باید اطمینان حاصل کنید که قبل از پایان حلقه، داده های متغیر TempData در داخل متغیر TSOutput قرار گرفته باشند. در غیر این صورت، شما درنهایت با یک سطر خالی مواجه می شوید. این سطر خالی، توسط تابع ()textscan به هنگام آخرین دور از خواندن فایل مورد نظر به دست می آید.