2012-01-10 5 views
7

Estoy leyendo datos de una tabla usando textscan(). La tabla tiene 90 columnas y quiero leer los valores de cada columna como un número de coma flotante. En cuanto a la documentación, tengo que usar especificador %f - pero parece que necesito para usarlo 90 veces, por lo que termino con esto:Evite escribir el especificador de conversión para cada columna en la tabla grande en `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'); 

que básicamente funciona, pero me pregunto si hay alguna manera alrededor para evitar escribir especificador para cada columna que tengo en mi tabla.

Respuesta

11

uso repmat para construir su cadena de formato basado en el número de columnas.

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

Esto es lo suficientemente flexible como para usarlo si tiene, por ejemplo, unas columnas de cadena par mezclan en

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

Excelente, esto es exactamente lo que necesito, ¡salud! –

3

Para un archivo ASCII muy simple compuesto por 90 columnas de números de punto flotante separadas por un delimitador conocido, tal vez sería más simple utilizar la función Matlab dlmread.

Por ejemplo si su rand.txt archivo es:

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 

que puede utilizar: randmat=dlmread('rand.txt');

+0

Hmm pero esta solución lee los datos en una matriz, mientras que necesito leerlo en una matriz celular y también el uso de 'FID 'identificador (que' textscan' hace). –

+0

Puede convertir una matriz en una matriz de celdas a través de la función [mat2cell] (http://www.mathworks.fr/help/techdoc/ref/mat2cell.html). En cuanto al identificador de archivo, a menudo ocurre que el nombre de archivo también está disponible; si no está en el contexto de su problema, las respuestas de Andrew Janke y Oli funcionarán perfectamente. Esta es solo una alternativa. – Aabaz

2

Sólo puede hacer una TextScan con sólo un "% f" y luego darle forma como desee o su conversión a la celda que desee:

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

Yo sugeriría el uso:.

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

Este código solo se leerá en la primera línea. Tendría que hacer un bucle para leer en todas las líneas del archivo. – goryh

Cuestiones relacionadas