【轉】matlab的textscan與textread區別


1、基本語法
textscan的基本語法是:
C = textscan(fid, 'format')
  
C = textscan(fid, 'format', N)

其中fid為fopen命令返回的文件標識符,這也是和textread的最大不同之處,需要注意的一點是,fid類似一個指針,其指向的位置會隨着textscan的操作而改變,每讀取一次數據,它的位置就會指向你已經讀過的那個數據的后面。format實際上就是一個字符串變量,表示讀取數據及數據轉換的規則。N為按照讀取格式format讀取的次數。

textread的基本語法是:

    [A,B,C,…] = textread(filename,format)

    [A,B,C,…] = textread(filename,format,N)
其中filename就是文件名, format就是要讀取的格式,A,B,C就是從文件中讀取到的數據。
必須嚴格遵守用法不可出現data=textread(filename,format,N)的形式

其中括號里面變量的個數必須和format中定義的個數相同。 如果每N行相同格式的數據,可采用[A,B,C,…] = textread(filename,format,N)的語法,讀取N次。

2,兩者的區別

可以看出這個兩個函數最大的區別就是:textread不用先fopen那個文件,適用於格式統一的txt文件的一次性大批量讀取。而使用textscan函數之前需要先用fopen函數打開要讀取的文件並返回句柄fid。

其次textread讀取某個文件后,下次再用textread讀取這個文件時,還是會從文件頭開始讀取。而textscan函數每次讀完數據后,其對應的句柄fid都是指向接下來要讀數據的地方,類似於C函數中的文件讀取指針,這樣更方便於讀取文本時的精確控制。

再次,textscan函數可以將多組數據讀到一個元胞矩陣中,而textread函數只能將數據分別讀取到不同的向量中。比如一個含有10行3列浮點數的文件,textscan函數可以將之讀取到一個變量名A下 A=textscan(fid, '%f%f%f'), 而使用textread函數必須將之讀入到三個變量名中  [A,B,C] = textread(filename,'%f%f%f')。

3,幾個方便的語法

假設文件myfile.txt 中的內容如下

    Sally Type1 12.34 45 Yes

    Joe Type2 23.54 60 No

    Bill Type1 34.90 12 No

3.1將其分別使用textread 和textscan讀出:

[data1 data2 data3 data4 data5] = textread('myfile.txt','%s%s%f%d%s');使用textread函數分別將數據按照格式讀入到data1—data5中。然后可使用賦值語句data=[data1 data2 data3 data4 data5 data6]生成一個二維數組data。

fid = fopen('myfile.txt');

C = textscan(fid, '%s%s%f%d%s');

fclose(fid);使用textscan函數讀取文件,輸出C為1*5的細胞數組,每個數組中存放每列的數據

3.2如果只讀取第一列的數據,可使用如下語句:

[names]=textread('myfile.txt','%s%*[^n]');

%*[^n] 表示從當前直接跳到行尾,而使用%[^n]則表示一直讀到行尾,% *是一個跳過符號,表示跳過該位。例如在讀取上述文件過程中只讀取浮點數的整數位,可使用如下兩種語句,將小數點在內的小數部分看作浮點數或者字符串,讀取是略過。

[data1 data2 data3 data4 data5] = textread('myfile.txt','%s%s-%*f%d%s');

或者

[data1 data2 data3 data4 data5] = textread('myfile.txt','%s%s-%*s%d%s');

3.3另外如果我想略過若干行之后才開始讀取數據的話,可以使用headerlines命令定義略過的行數。如果數據之間不是使用空格作為分隔符的話,可以使用delimiter命令定義各種分隔符。

'headerlines',1,'delimiter',';'

3.4如果我想讀取文件中70行70列的文件該怎么辦呢? 當然我們可以在函數中format處寫上70個%f,但這樣太麻煩了。有一種簡單的方法就是使用下面的函數。

FormatString=[repmat(' %f',1,70)];
ez = cell2mat(textscan(f1,FormatString,70,'HeaderLines',3));

第一句話表示定義一個含有70個%f的字符串,第二句話的意思是 將此字符串作為讀取格式,按照這個格式讀取70次,並忽略文件中的前三行。 由於textscan只是把數據讀到了一個元胞數組中了,需要使用cell2mat函數將這里面的所有 cell組合成一個數組。

暫時以上敘述到的東西應該夠我今后進行數據處理了。如果想閱讀更為詳細的說明的話,除了matlab的幫助文檔外,以下幾篇日志也非常不錯:


textscan
http://blog.sina.com.cn/s/blog_9e67285801010buf.html
http://www.douban.com/note/6181453

textread
http://itlab.idcquan.com/linux/administer/872894.html
http://blog.sina.com.cn/s/blog_9e67285801010bju.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM