Избегайте набора спецификатора преобразования для каждого столбца в большой таблице в «Textscan»

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

  •  26-10-2019
  •  | 
  •  

Вопрос

Я читаю данные из таблицы, используя textscan(). Анкет Таблица имеет 90 столбцов, и я хочу прочитать значения каждого столбца в виде номера с плавающей точкой. Глядя на документацию, я должен использовать Specifier %f - но кажется, что мне нужно использовать его 90 раз, поэтому я в конечном итоге:

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

который в основном работает, но мне интересно, есть ли какой -то способ, чтобы избежать набора спецификатора для каждого столбца, который у меня есть в моей таблице.

Это было полезно?

Решение

Использовать repmat Чтобы создать строку формата на основе количества столбцов.

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

Это достаточно гибко, чтобы использовать, если у вас была смешанная пара строковых столбцов.

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

Другие советы

Для очень простого файла ASCII, состоящего из 90 столбцов с плавающими номерами, разделенными известным разделителем, возможно, было бы проще использовать функцию MATLAB dlmread.

Например, если ваш файл rand.txt:

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

Вы можете использовать: randmat=dlmread('rand.txt');

Вы можете просто сделать текстовую ткань только с одним «%f», а затем изменить его так, как вы хотите, или преобразовать в ячейку, как вы хотите:

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

Я бы предложил использовать:

fileId=fopen('fileloc.txt');
formatSpec='%f';
N=90;
data=textscan(fileId,formatSpec,N);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top