Избегайте ввода спецификатора преобразования для каждого столбца в большой таблице в тексте - PullRequest
8 голосов
/ 10 января 2012

Я читаю данные из таблицы, используя 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 ]

12 голосов
/ 10 января 2012

Используйте 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);
3 голосов
/ 10 января 2012

Для очень простого 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');

2 голосов
/ 10 января 2012

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

fid=fopen('bla.txt','r');
M=textscan(fid,'%f')
M=reshape(M{1},[],5)
M=num2cell(M,1)
fclose(fid);
1 голос
/ 20 октября 2014

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

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