2015-04-26 3 views
2

Я пытаюсь прочитать определенный текстовый файл в Matlab и хранить только значения float в матрице Matlab. Я нашел несколько разных способов сделать это, но никто не работает так, как я хочу. Я думаю, что проблема заключается в форматировании текстового файла. Вот первые несколько строк файла:Базовый файл ввода/вывода в Matlab

**K = 1, J = 1 
37.9072 37.9072 37.872 37.9072 37.9072 37.5572 37.9072 
37.9072 37.9172 37.9072 37.962 37.9552 37.9072 
37.9222 37.9072 37.9322 37.9072 37.9332 37.9072 
** K = 2, J = 1 
34.9249 34.9249 34.9349 34.9249 34.9679 34.9249 34.9249 
34.9249 34.2439 34.9249 34.9249 34.9249 34.9249 
34.9459 34.9249 34.9549 34.9249 34.6749 34.9889 
**K = 3, J = 1 
37.94501 37.94401 37.94501 37.94501 37.99501 37.96501 37.94501 
37.94501 37.94101 37.93301 37.94501 37.94501 37.94501 
37.94501 37.90501 37.94501 37.90001 37.94501 37.99801 

вопросы, которые я имею в том, что: 1) каждый номер не разделены табуляцией, а вместо этого разделены несколькими пробелами, и 2) в первой строке каждой строки после «**» содержит 7 столбцов данных, а последующие строки содержат только 6 столбцов данных. Я могу читать строки, которые я хочу использовать tline = fgetl (fid), но как я могу извлечь плавающие значения в tline, чтобы я мог назначить их в вектор Matlab?

В идеале, что бы я хотел иметь для каждого блока данных, разделенных символом «**», код ввода-вывода читает это в вектор Matlab. Например, для первого блока К = 1, J = 1, я бы вектор:

VEC1 = [37,9072 37,9072 37,9072 37,9072 37.9072 ...]

а затем в течение второго блока К = 2 , J = 1, я бы:.

VEC = [37,9429 37,9429 37,9429 37,9429 37,9429 37.9429 ...]

каждый вектор, VEC были бы размером [1 19] (т.е. 19 точек данных в каждом блок данных). Ниже приведена моя попытка решить проблему (что неверно):

fid = fopen('Temp2017-01-01.txt'); 

m = 1; 

while ischar(tline) 

if(tline(1) == '*') %to skip lines which start with '*' 
    tline = fgetl(fid); 
elseif(length(tline) > 112) %to get the line containing 7 columns of data 

vec(m, :) = sscanf(tline(1:end), '%f,%f,%f,%f,%f,%f,%f') 

else %to get the lines containing 6 columns of data 

    vec(m, :) = sscarf(tline(1:end), '%f,%f,%f,%f,%f,%f,%*s') 

end 

m = m + 1; 

end 

fclose(fid); 

Любые советы будут оценены. Спасибо,

EDIT: Я все еще не могу заставить это работать даже с помощью текстового экрана, как предложил Хоки (спасибо кстати). Сообщения об ошибках, которые я получаю: 1) Неправильное назначение с прямоугольной пустой матрицей и 2) Невозможно поддерживать массивы ячеек, содержащие массивы ячеек или объекты. Кроме того, назначение М = cell2mat (г) возвращает что-то вроде:

NaN NaN NaN NaN NaN NaN NaN NaN 37,9828800000000 NaN NaN NaN NaN NaN NaN NaN 37.9828800000000

Я забыл дать понять, что между каждым поплавком в текстовом файле примера выше, есть 8 пробелов. Когда я использую textscan, он возвращает массив ячеек строк. Каждая строка что-то вроде:

'37.9072 37.9072 37.9072  ...' 

Я хотел бы извлечь каждую из этих отдельных записей в вектор или матрицу. После чтения ошибок я получаю одно объяснение, что cell2mat работает только для нестроковых записей. Любые дальнейшие советы очень ценятся.

Спасибо,

ответ

1

textscan функция является вашим другом (прочитать документ для получения дополнительной информации).Пользуясь тем, что:

fid = fopen('Temp2017-01-01.txt'); 

vec = zeros(0,19) ; 
while ~feof(fid) 
    l0 = fgetl(fid) ; %// do nothing with that (or extract the K and J if you need them) 

    %// this will read as many '%f' numbers it can (19 in your case) 
    M = textscan(fid , '%f' , 'delimiter',' ') ; 

    vec(end+1,:) = cell2mat(M) ; %// convert them to matrix and add to global result 
end 

fclose(fid) 

Mlint будет жаловаться, что матрица vec растет на каждой итерации, но если вы не знаете заранее, количество блоков вы собираетесь читать у вас нет выбора. Просто иди с ним.

+0

Спасибо Хоки. Я последовал твоему предложению, но до сих пор не могу заставить это работать (см. Выше). – AJA

+0

@ AJA. cell2mat работает только на числовые значения. Обновите свой пост, чтобы показать несколько строк вашего текстового файла точно так, как они есть, иначе будет слишком много проб и ошибок. Также укажите, является ли шаблон строк согласованным (всегда одинаковым) или иногда другим. – Hoki

1

Если вам не нужно знать, что значения в полях **, то вы можете использовать 'CommentStyle' сделать textscan игнорировать эти строки, и пусть MATLAB выяснить числовые части (с возможными несколькими пробельных разделителей) , Затем, поскольку вы знаете, что каждая секция имеет 19 значений, выполните общий вариант. Нет необходимости цикл (это работает на R2013b с данными выборки):

fid = fopen('yourfile.txt') 
C = textscan(fid,'%f','CommentStyle','**'); 
fclose(fid) 
C = C{1}; % escaping cell 
% reshape to be 19 numbers on each row 
C = reshape(C,19,[]); 
C = C'; 

C(1,:) не теперь ваш первый набор данных, C(2,:) второй сет, и так далее (проще перебрать, если это необходимо).

Смежные вопросы