Избегайте ввода спецификатора преобразования для каждого столбца в большой таблице в тексте
Я читаю данные из таблицы, используя textscan()
, Таблица имеет 90 столбцов, и я хочу прочитать значения каждого столбца как число с плавающей запятой. Глядя на документацию, я должен использовать спецификатор %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');
что в принципе работает, но мне интересно, есть ли способ избежать ввода спецификатора для каждого столбца в моей таблице.
4 ответа
Использование 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);