2012-01-10 40 views
7

我正在使用textscan()從表中讀取數據。該表有90列,我想讀取每列的值作爲浮點數。望着文檔,我必須使用符%f - 但似乎我需要使用它的90倍,所以我結束了這一點:避免在`textscan`的大表中爲每列輸入轉換說明符

c = textscan(fid,'%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f 
        %f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f 
        %f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f 
        %f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f'); 

基本上工作,但我想知道是否有某種方式以避免爲表格中的每一列輸入說明符。

回答

11

使用repmat基於列的數量,以建立自己的格式字符串。

nCols = 60; 
format = repmat('%f', [1 nCols]); 
c = textscan(fid, format); 

這是非常靈活,如果你有例如使用一對夫婦的字符串列在混合

nNumberCols = 58; 
format = ['%s%s' repmat('%f', [1 nNumberCols])]; 
c = textscan(fid, format); 
+0

非常好,這正是我需要的,歡呼! – 2012-01-10 16:55:35

3

對於由已知分隔符分隔的90列浮點數組成的非常簡單的ASCII文件,使用Matlab函數dlmread可能會更簡單。

例如,如果你的文件rand.txt是:

0.8147 0.0975 0.1576 0.1419 0.6557 
0.9058 0.2785 0.9706 0.4218 0.0357 
0.1270 0.5469 0.9572 0.9157 0.8491 
0.9134 0.9575 0.4854 0.7922 0.9340 
0.6324 0.9649 0.8003 0.9595 0.6787 

您可以使用:randmat=dlmread('rand.txt');

+0

嗯,但是這種解決方案將數據讀入一個矩陣,而我需要把它讀成一個單元陣列,並且還使用'FID '標識符('textscan')。 – 2012-01-10 15:50:50

+0

您可以通過函數[mat2cell](http://www.mathworks.fr/help/techdoc/ref/mat2cell.html)將矩陣轉換爲單元陣列。至於文件標識符,通常情況下,文件名也是可用的,如果它不在你的問題的上下文中,那麼Andrew Janke和Oli的答案將工作得很好。這只是一個選擇。 – Aabaz 2012-01-10 16:23:07

2

你可以做一個textscan只有一個「%F」,然後重塑它,只要你想或者將其轉換成細胞,只要你想:

fid=fopen('bla.txt','r'); 
M=textscan(fid,'%f') 
M=reshape(M{1},[],5) 
M=num2cell(M,1) 
fclose(fid); 
1

我建議使用:

fileId=fopen('fileloc.txt'); 
formatSpec='%f'; 
N=90; 
data=textscan(fileId,formatSpec,N); 
+0

此代碼只會在第一行讀取。您需要循環讀取文件的所有行。 – goryh 2017-10-02 12:20:10