Избегайте набора спецификатора преобразования для каждого столбца в большой таблице в «Textscan»
Вопрос
Я читаю данные из таблицы, используя 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);