2015-10-06 2 views
1

В настоящее время я пытаюсь читать данные из текстового файла, написанного именно так:Считывание несколько данных из MATLAB файл

Height = 10 
Length = 10 
NodeX = 11 
NodeY = 11 
K = 10 

я написал небольшой код, как этот

fileID = fopen('input.dat','r'); 
[a, b] = fscanf(fileID, '%s %f') 

И Я получаю следующий ответ:

a = 

    72 
    101 
    105 
    103 
    104 
    116 


b = 

    1 

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

ответ

2

В the documentation для fscanf состояния:

Если formatSpec содержит комбинацию числовых и символьных спецификаторов, то fscanf преобразует каждый символ в его числовой эквивалент . Это преобразование происходит, даже если формат явно пропускает все числовые значения (например, formatSpec - '%*d %s').

MATLAB может быть досадно плохо при чтении смешанных типов данных. Одна из возможных альтернатив, чтобы прочитать каждую строку и разделить ваши данные, используя простое регулярное выражение:

fileID = fopen('results.txt','r'); 

mydata = {}; 
ii = 1; 
while ~feof(fileID) % While we're not at the end of the file 
    tline = fgetl(fileID); % Get next line 
    mydata(ii,:) = regexp(tline, '([a-zA-Z])* = (\d*)', 'tokens'); 
    ii = ii + 1; 
end 

fclose(fileID); 

Это возвращает массив 5 x 1 клеток, где каждая ячейка содержит 2 клетки (немного раздражает, но вы можете вытащить их), что соответствуют вашим данным. В этом случае mydata{1}{1} - Height и mydata{1}{2} - 10.


Edit:

И вы можете сгладить свой массив ячеек с reshape вызова:

mydata = reshape([mydata{:}], 2, [])';

который превращает mydata в этом случае в массиве 5x2 клеток.

+0

Я получаю следующее текущее регулярное выражение Ссылка на содержимое ячеек от объекта несетевого массива. Ошибка в главном (строка 6) mydata = reshape ([mydata {:}], 2, []) ' –

+0

Приведенный код работает для предоставленного файла данных.Какие изменения вы внесли в файл данных и/или код? – excaza

+0

Мне удалось заставить его работать. Большое вам спасибо. Ты мне очень помог! –

2

Функция fscanf является низкоуровневой функцией ввода-вывода и часто не является лучшим выбором для такого довольно высокого уровня ввода файлов. Одним из вариантов было бы использовать функцию textscan, что позволяет довольно продвинутые спецификации формата:

fileID = fopen('input.dat','r'); 
C = textscan(fileID,'%s = %d') 

, который создает массив 1х2 клеток. Первая ячейка C{1} содержит еще одну ячейку 5x1, где каждое поле содержит имя поля, например. 'Height'. Вторая ячейка C{2} содержит вектор 5x1, содержащий все целочисленные значения из файла.

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