Evite escribir el especificador de conversión para cada columna en una tabla grande en `TextScan`
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.
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);