Evite escribir el especificador de conversión para cada columna en una tabla grande en `TextScan`

StackOverflow https://stackoverflow.com/questions/8805685

  •  26-10-2019
  •  | 
  •  

Pregunta

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 punto flotante. Mirando la documentación, tengo que usar el especificador %f - Pero parece que necesito usarlo 90 veces, así que termino con esto:

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');

Lo que básicamente funciona, pero me pregunto si hay alguna forma de evitar escribir el especificador para cada columna que tengo en mi tabla.

¿Fue útil?

Solución

Usar repmat Para construir su cadena de formato en función del número de columnas.

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

Esto es lo suficientemente flexible como para usar si tenía, por ejemplo, un par de columnas de cadena mezcladas.

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

Otros consejos

Para un archivo ASCII muy simple compuesto por 90 columnas de números de puntos flotantes separados por un delimitador conocido, tal vez sería más simple usar la función MATLAB dlmread.

Por ejemplo, si su archivo rand.txt 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

Puedes usar: randmat=dlmread('rand.txt');

Puede simplemente hacer un TextScan con solo un "%F" y luego remodelarlo como desee o convertirlo en celda como desee:

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

Sugeriría usar:

fileId=fopen('fileloc.txt');
formatSpec='%f';
N=90;
data=textscan(fileId,formatSpec,N);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top