2012-01-10 3 views
7

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

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

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

ответ

11

Используйте 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); 
+0

Отлично, это именно то, что мне нужно, приветствия! –

3

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

+0

Хм, но это решение считывает данные в матрицу, в то время как мне нужно прочитать его в массив ячеек, а также с помощью 'шлагтов 'идентификатор (который' textscan' делает). –

+0

Вы можете преобразовать матрицу в массив ячеек с помощью функции [mat2cell] (http://www.mathworks.fr/help/techdoc/ref/mat2cell.html). Что касается идентификатора файла, часто бывает, что имя файла также доступно, если оно не в контексте вашей проблемы, тогда ответы Эндрю Янка и Оли будут работать нормально. Это просто альтернатива. – Aabaz

2

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

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

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

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

Этот код будет читать только в первой строке. Вам нужно будет зациклировать его для чтения во всех строках файла. – goryh