MATLAB читает строку, начинающуюся с определенной строки из файла?

Вопрос:

У меня есть грязный файл журнала, из которого я хочу извлечь полезную для меня информацию. По messy, я имею в виду, что файл может содержать произвольные строки символов/чисел. Однако номерам, которые мне нужно извлечь, всегда предшествует определенная строка – new beta value =.

Итак, пример, если мой входной файл журнала

3456789FGHJKLcvbnm,.ghjkl
Error!
Warning. GHJKL:6&*()_
new beta value = 1557.01
$%^&*()VGBNM<
GBHNM<
Warning!!!
This is a random line
new beta value = 1101.6
TL:vbNM<>%^UIOP
FGHJKL]\[;/
new beta value = 100
...

Я надеюсь читать

1557.01
1101.6
100
...

в MATLAB.

Кажется, что для этого MATLAB не имеет встроенных функций. Как я могу это достичь?

Лучший ответ:

Одна реализация с использованием fgetl

queryline = 'new beta value';

fID = fopen('test.txt');
mydata = []; % Initialize data
while ~feof(fID) % Loop until we get to the end of the file
    tline = fgetl(fID);
    if ~isempty(strfind(tline, queryline))
        % If we find a match for our query string in the line of the file
        formatspec = sprintf('%s = %%f', queryline)
        mydata = [mydata sscanf(tline, formatspec)];
    end
end

fclose(fID);

Ответ №1

Как предположил @excaza, есть несколько способов сделать это. Я нахожу прочитанный весь файл и использую regexp намного проще + быстрее.

indata = fileread('test.txt');
pattern = 'new beta value =\s+(\d+.\d+)'; %//the pattern you are looking for is a Stirng "new beta value =" followed by a Double (which is the integer part of the number you are looking for) + a dot(or decimal) + another Double (which is the part 2 of the number you are looking for)
lines = regexp(indata, pattern, 'tokens'); %//output as cell array

result = cell2mat(cellfun(@(x) str2double(x{:}), lines, 'UniformOutput', false)); %//output as Matrix

result =

1557.01        1101.6         100

Ответ №2

Здесь другая реализация:

fid = fopen('file.txt', 'r');
str = reshape(fread(fid,inf,'*char'),1,[]);
fclose(fid);
numbers = str2double(regexp(str, '(?<=new beta value =\s+)\d+(.\d*)?','match')).';

Это работает следующим образом:

  • Строки 1–3: содержимое файла считывается как строка.
  • Строка 4: для извлечения чисел применяется регулярное выражение. Lookbehind используется для обнаружения (но не соответствия) строки. Результатом является массив ячеек строк, к которому применяется str2double для преобразования в вектор чисел.

Предполагаемый формат:

  • Формат номера \d+(.\d*)? определяет номера формы 100.34 или 100. Он не обнаруживает -100, -100.34, .34, -.34. Если вам тоже нужны эти случаи, вам нужно соответствующим образом изменить регулярное выражение.
  • Строка, которая отмечает желаемые номера, может необязательно содержать пробел перед номером (как в вашем примере). В противном случае удалите \s+ в регулярном выражении.
Оцените статью
TechArks.Ru
Добавить комментарий