Довольно грубый подход - прочитать файл построчно и проверить, состоит ли строка из трех чисел. Если это так, добавьте это во временную матрицу. Когда вы наконец дойдете до строки, в которой нет трех чисел, добавьте эту матрицу как элемент в массив ячеек, очистите временную матрицу и продолжите.
Примерно так будет работать, если файл хранится в 'file.txt'
:
%// Open the file
f = fopen('file.txt', 'r');
%// Initialize empty cell array
data = {};
%// Initialize temporary matrix
temp = [];
%// Loop over the file...
while true
%// Get a line from the file
line = fgetl(f);
%// If we reach the end of the file, get out
if line == -1
%// Last check before we break
%// Check if the temporary matrix isn't empty and add
if ~isempty(temp)
data = [data; temp];
end
break;
end
%// Else, check to see if this line contains three numbers
numbers = textscan(line, '%f %f %f');
%// If this line doesn't consist of three numbers...
if all(cellfun(@isempty, numbers))
%// If the temporary matrix is empty, skip
if isempty(temp)
continue;
end
%// Concatenate to cell array
data = [data; temp];
%// Reset temporary matrix
temp = [];
%// If this does, then create a row vector and concatenate
else
temp = [temp; numbers{:}];
end
end
%// Close the file
fclose(f);
Код довольно понятен, но давайте углубимся в него, чтобы убедиться, что вы знаете, что происходит. Сначала откройте файл с помощью fopen
, чтобы получить "указатель" на файл, затем инициализируйте наш массив ячеек, который будет содержать наши матрицы, а также временную матрицу, используемую при чтении матриц между информацией заголовка. После того, как мы просто переберем каждую строку файла и сможем выделить строку с помощью fgetl
< / a> используя созданный нами указатель файла. Затем мы проверяем, достигли ли мы конца файла, и если да, то давайте проверим, есть ли во временной матрице какие-либо числовые данные. Если это так, добавьте это в наш массив ячеек и, наконец, выйдите из цикла. Мы используем fclose
, чтобы закрыть файл и очистить его.
Теперь суть операции - это то, что следует после этой проверки. Мы используем textscan
и ищем три числа, разделенных пробелами. Это сделано с помощью спецификатора формата '%f %f %f'
. Это должно дать вам массив ячеек из трех элементов, если вы добились успеха с числами. Если это верно, преобразуйте этот массив ячеек элементов в строку чисел и объедините ее во временную матрицу. Выполнение temp = [temp; numbers{:}];
облегчает эту конкатенацию. Просто соединяю каждое число вместе и соединяю их по горизонтали, чтобы создать одну строку чисел. Затем я беру эту строку и объединяю ее как другую строку во временной матрице.
Если мы наконец дойдем до строки, где весь текст, это даст вам все три элемента в массиве ячеек, найденных textscan
, чтобы быть пустыми. Это цель all
и _ 11_ позвонить. Мы ищем каждый элемент в ячейке и смотрим, пуст ли он. Если каждый элемент пуст, это строка текста. Если возникает такая ситуация, просто возьмите временную матрицу и добавьте ее как новую запись в свой массив ячеек. Затем вы сбросите временную матрицу и снова запустите логику.
Однако мы также должны учитывать, что текст может состоять из нескольких строк. Для этого нужен дополнительный оператор if
внутри первого блока if
с использованием all
. Если у нас есть дополнительная строка текста, которая предшествует предыдущей строке, временная матрица значений все еще должна быть пустой, и поэтому вы должны проверить, пуста ли она, прежде чем пытаться объединить временную матрицу. Если он пуст, не беспокойтесь и просто продолжайте.
После запуска этого кода я получаю для своей матрицы данных следующее:
>> format long g
>> celldisp(data)
data{1} =
0 -2.680148e-16 0
9.84392531300799e-12 -4.75347e-06 2.216314e-11
1.00005260577246e-11 -4.835427e-06 2.552497e-11
1.03137275471577e-11 -4.99934e-06 -3.042096e-12
1.09401305260241e-11 -5.327165e-06 -1.206968e-11
data{2} =
0 -2.680148e-16 0
9.84392531300799e-12 -4.75347e-06 2.216314e-11
1.00005260577246e-11 -4.835427e-06 2.552497e-11
1.03137275471577e-11 -4.99934e-06 -3.042096e-12
1.09401305260241e-11 -5.327165e-06 -1.206968e-11
Чтобы получить доступ к определенной «таблице», выполните data{ii}
, где ii
- это таблица, к которой вы хотите получить доступ, которая была прочитана сверху вниз в вашем текстовом файле.
person
rayryeng
schedule
28.01.2016
textscan
для ваших числовых и текстовых данных. - person Daniel   schedule 28.01.2016