Использование Matlab для извлечения данных между текстом

Я пытаюсь экспортировать набор данных, и я хорошо знаю об этом. Рассматриваемые данные имеют следующую структуру:

#              ************************************
#              *****    GLOBAL ATTRIBUTES    ******
#              ************************************
#

#     PROJECT                         THEMIS
#
UT                                             UT      BX_FGL-D      BY_FGL-D      BZ_FGL-D
                                                         (@_1_)        (@_2_)        (@_3_)
dd-mm-yyyy hh:mm:ss.mil.mic.nan.pic           sec        nT_GSE        nT_GSE        nT_GSE
21-05-2015 00:00:00.223.693.846.740   1.43208E+09       1.14132       9.14226       27.1446
21-05-2015 00:00:00.473.693.845.716   1.43208E+09       1.11194       9.16192       27.1798
21-05-2015 00:00:00.723.693.844.692   1.43208E+09       1.12992       9.11103       27.1595
21-05-2015 00:00:00.973.693.843.668   1.43208E+09       1.15966       9.15324       27.1589
21-05-2015 00:00:01.223.693.846.740   1.43208E+09       1.20576       9.14420       27.1388
21-05-2015 00:09:59.973.693.843.668   1.43208E+09       1.97445       8.66407       26.1837
#  
# Key Parameter and Survey data (labels K0,K1,K2) are preliminary browse data.
# Generated by CDAWeb on: Mon May 27 06:01:29 2019

Мне нужны те, которые написаны между «дд-мм-гггг…». и «# # Key Parameter» для экспорта в столбцы. Например. , первая линия 21-05-2015 00:00: 00.223.693.846.740 1.43208E + 09 1.14132 9.14226 27.1446, должна экспортироваться в 21, 05,2015, 00,00,00223,693 846,740, 1.43208E + 09,1.14132, 9.14226 и 27.1446.

Подобный вопрос решается на Используйте MATLAB для извлечения данных за пределами «Данные начинаются на следующей строке:» в текстовом файле., но я считаю, что мои данные сложны, и я не мог дальше. Лучшее, что я мог сделать, это написать часть кода для чтения до «дд-мм-гггг»:

clear;clc;close all;
f = fopen('dataa_file.txt');
line = fgetl(f);
while isempty(strfind(line, 'nT_GSE'))
    if line == -1 %// If we reach the end of the file, get out
        break;
    end
    line = fgetl(f);
end

Любая помощь будет принята с благодарностью…

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
153
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кажется, это работает. Предполагается, что

  • Первая строка, содержащая числа, находится сразу после строки, начинающейся с 'dd-mm-yyyy'.
  • Последняя строка, содержащая числа, находится на две строки выше строки, начинающейся с '# Key Parameter'.

Код:

t = fileread('file.txt'); % Read the file as a character vector
t = strsplit(t, {'\r' '\n'}, 'CollapseDelimiters', true); % Split on newline or carriage
    % return. This gives a cell array with each line in a cell
ind_start = find(cellfun(@any, regexp(t, '^dd-mm-yyyy', 'once')), 1) + 1; % index of
    % line where the numbers begin: immediately after the line 'dd-mm-yyyy...'
ind_end = find(cellfun(@any, regexp(t, '^# Key Parameter', 'once')), 1) - 2; % index of
    % line where numbers end: two lines before the line '# Key Parameter...'
result = cellfun(@(u) sscanf(u, '%d-%d-%d %02d:%02d:%02d.%d.%d.%d.%d %f %f %f %f').', ...
    t(ind_start:ind_end), 'UniformOutput', false);
    % Apply sscanf to each line. The format specifier uses %d where needed to prevent
    % the dot from being interpreted as part of a floating point number. Also, the
    % possible existence of leading zeros needs to be taken into account. The result is
    % a cell array, where each cell contains a numeric vector corresponding to one line
result = cell2mat(result.'); % convert the result to a numerical array

Спасибо, это сработало. Если бы вы могли уточнить различные команды, которые использовались, это было бы очень полезно.

sreeraj t 30.05.2019 15:02

Другие вопросы по теме