9
votes

Évitez de taper le spécificateur de conversion pour chaque colonne de la grande table dans `Textscan`

Je lis des données d'une table à l'aide de textscan () code>. La table compte 90 colonnes et je souhaite lire les valeurs de chaque colonne en tant que numéro de point flottant. En regardant la documentation, je dois utiliser le spécificateur % f code> - mais il semble que je dois l'utiliser 90 fois, donc je me retrouve 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');


0 commentaires

4 Réponses :


3
votes

Pour un fichier ASCII très simple composé de 90 colonnes de nombres de points flottants séparés par un délimiteur connu, il serait peut-être plus simple d'utiliser la fonction MATLAB dlmread .

Par exemple si votre fichier rand.txt est: xxx

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


2 commentaires

HMM mais cette solution lit les données dans une matrice, alors que je dois la lire dans une matrice de cellule et utiliser également l'identifiant FID (quel textscan fait).


Vous pouvez convertir une matrice en une matrice de cellule via la fonction MAT2Cell . Quant à l'identifiant de fichier, il est souvent le cas que le nom de fichier est également disponible, s'il ne s'agit pas dans le contexte de votre problème, Andrew Janke et les réponses de l'OLI fonctionneront très bien. Ceci est juste une alternative.



2
votes

Vous pouvez simplement faire un textuscan avec un seul "% f" puis le remodeler comme vous le souhaitez ou la convertir à la cellule que vous le souhaitez:

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


0 commentaires

12
votes

Utilisez repmat code> pour créer votre chaîne de format en fonction du nombre de colonnes.

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


0 commentaires

1
votes

Je suggérerais d'utiliser:

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


1 commentaires

Ce code ne sera lu que dans la première ligne. Vous auriez besoin de la boucler pour lire dans toutes les lignes du fichier.