Évitez de taper spécificateur de conversion pour chaque colonne de grande table `textscan`

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

  •  26-10-2019
  •  | 
  •  

Question

Je lis les données d'une table à l'aide textscan(). La table a 90 colonnes et je veux lire les valeurs de chaque colonne en nombre à virgule flottante. En regardant la documentation, je dois utiliser spécificateur %f - mais il semble que je dois l'utiliser 90 fois, donc je finis avec ceci:

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

qui fonctionne essentiellement, mais je me demande s'il y a une manière autour de spécificateur de frappe à éviter pour chaque colonne que j'ai dans ma table.

Était-ce utile?

La solution

Utilisez repmat pour construire votre chaîne de format en fonction du nombre de colonnes.

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

est suffisamment souple pour utiliser si vous aviez par exemple une colonne de chaîne de couple mixte dans.

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

Autres conseils

Pour un fichier ASCII très simple composé de 90 colonnes de nombres à virgule flottante séparés par un séparateur connu, il serait peut-être plus simple d'utiliser la fonction Matlab dlmread .

Par exemple, si votre rand.txt de fichier est:

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

Vous pouvez utiliser: randmat=dlmread('rand.txt');

Vous pouvez juste faire un textscan avec une seule « % f » puis remodeler que vous le souhaitez ou le convertir à la cellule que vous voulez:

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

Je suggère l'utilisation:

fileId=fopen('fileloc.txt');
formatSpec='%f';
N=90;
data=textscan(fileId,formatSpec,N);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top