2012-01-10 9 views
7

Sto leggendo i dati da una tabella utilizzando textscan(). La tabella ha 90 colonne e voglio leggere i valori di ogni colonna come un numero in virgola mobile. Guardando la documentazione, devo usare specificatore %f - ma sembra che ho bisogno di usare 90 volte, così finisco con questo:Evitare di digitare l'identificatore di conversione per ogni colonna nella tabella grande in `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'); 

che fondamentalmente funziona, ma mi chiedo se c'è qualche modo in giro per evitare di digitare specifier per ogni colonna che ho nella mia tabella.

risposta

11

Usa repmat di costruire la vostra stringa di formato in base al numero di colonne.

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

Questo è abbastanza flessibile da utilizzare se si avesse ad es. un colonne paio stringa mista in

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

Eccellente, questo è esattamente quello di cui ho bisogno, evviva! –

3

Per un file ASCII molto semplice composto da 90 colonne di numeri in virgola mobile separati da un delimitatore noto, forse sarebbe più semplice utilizzare la funzione Matlab dlmread.

Ad esempio se il vostro rand.txt file è:

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 

È possibile utilizzare: randmat=dlmread('rand.txt');

+0

Hmm, ma questa soluzione legge i dati in una matrice, mentre ho bisogno di leggere in un array di celle e anche utilizzando 'fid 'identificatore (che' textscan' fa). –

+0

È possibile convertire una matrice in un array di celle tramite la funzione [mat2cell] (http://www.mathworks.fr/help/techdoc/ref/mat2cell.html). Per quanto riguarda l'identificativo del file, è spesso il caso che il nome del file sia anche disponibile, se non è nel contesto del tuo problema, allora le risposte di Andrew Janke e Oli funzioneranno perfettamente. Questa è solo un'alternativa. – Aabaz

2

È solo può fare un textSCAN con una sola "% f" e poi rimodellare come si vuole o convertirlo in cella come si vuole:

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

vorrei suggerire l'uso:.

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

Questo codice verrà letto solo nella prima riga. Avresti bisogno di un loop per leggere in tutte le righe del file. – goryh

Problemi correlati