Yup. Сначала используйте importdata
, чтобы вы могли читать каждую строку своего текстового файла как ячейку в массиве ячеек. После этого, чтобы разрешить обработку ваших действий в MATLAB, вам необходимо заменить каждый символ ,
на .
. Это позволит вам использовать команды MATLAB для обработки даты и времени. В частности, используйте regular expressions, чтобы помочь вам в этом. Регулярные выражения помогают находить шаблоны в строках. Мы можем использовать эти шаблоны для извлечения необходимых данных. Используйте regexprep
для замены всех ,
символов на .
.
Для целей настоящего ответа, например, данные, которые я буду использовать это:
00:00:00,000;-2,14;
00:00:00,001;-1,80;
00:00:00,002;-0,80;
00:00:00,003;2,40;
00:00:00,004;3,78;
Таким образом, при условии, что данные хранятся в текстовом файле с именем data.txt
, сделайте следующее:
%// Load in each row as a cell array
A = importdata('data.txt');
%// Each row has , replaced with .
Arep = regexprep(A, ',', '\.');
Теперь мы можем разделить все величины, используя ;
в качестве разделителя. Мы можем использовать regexp
, чтобы помочь нам разделить количество. Далее мы можем разложить данные по:
Arep_decomp = regexp(Arep, '[^;]+', 'match');
Первый параметр представляет собой массив ячеек, который содержит каждый из наших строк в текстовом файле (с запятые преобразуется в периоды). Второй параметр - это шаблон, который указывает, что именно вы пытаетесь найти в каждой строке массива ячеек. [^;]+
означает, что вы хотите найти все строки, состоящие из кучки символов , за исключением, пока мы не нажмем на запятую. Как только мы ударим по полуточке, остановимся. 'match'
означает, что вы хотите получить фактические строки, которые будут храниться в виде массивов ячеек.
Результата после выполнения Вышеприведенных строк дает:
Arep_decomp{1}{1} =
00:00:00.000
Arep_decomp{1}{2} =
-2.14
Arep_decomp{2}{1} =
00:00:00.001
Arep_decomp{2}{2} =
-1.80
Arep_decomp{3}{1} =
00:00:00.002
Arep_decomp{3}{2} =
-0.80
Arep_decomp{4}{1} =
00:00:00.003
Arep_decomp{4}{2} =
2.40
Arep_decomp{5}{1} =
00:00:00.004
Arep_decomp{5}{2} =
3.78
Вы можете видеть, что выходной массив клеток, Arep_decomp
является массивом ячеек 5 элементов, где каждая ячейка представляет собой вложенной массив ячеек 2 элемента, где первым элементом является время, а второй элемент - величина. Обратите внимание, что это все строки.
Теперь вы можете создать два числовых массива, которые преобразуют эти количества в числовые представления. В частности, формат времени, что у вас есть выглядит как форма:
HH:MM:SS.FFF
H
для часов, M
для минут, S
для секунд и F
для микросекунд. Используйте datenum
, чтобы вы могли конвертировать эти временные представления в номера фактической даты.Вы сделали бы это так, чтобы вы могли построить их на графике, но тогда вы, возможно, захотите отобразить эти времена на сюжете. Это легко сделать, манипулируя некоторыми функциями графика. Тем не менее, используйте cellfun
, чтобы мы могли извлечь строки времени в виде отдельного массива, чтобы мы могли использовать это для построения графика позже, а также использовать это, чтобы преобразовать строки времени в числовые числа через datenum
и преобразовать числа величин в фактические числа.
Поэтому:
datestr = cellfun(@(x) x{1}, Arep_decomp, 'uni', 0);
datenums = cellfun(@(x) datenum(x, 'HH:MM:SS.FFF'), datestr);
mags = cellfun(@(x) str2double(x{2}), Arep_decomp);
Первая строка кода извлекает из каждой из временных строк как массив одноклеточных - uni=0
флаг важно, чтобы сделать это. Затем мы преобразуем каждую строку времени в число, и преобразуем строки величин в физические числа на str2double
.
Теперь все, что вам нужно сделать, это построить данные. Это может быть сделано путем:
plot(datenums, mags);
set(gca, 'XTick', datenums);
set(gca, 'XTickLabel', datestr);
Приведенными выше коды участков данных, где число даты находится на горизонтальной оси, число магнитуды находится на вертикальной оси, но мы, вероятно, хотим переименовать горизонтальную ось, чтобы быть те временные строки, которые вы хотели. Поэтому мы используем для звонков set
, чтобы убедиться, что только видимые тики указаны из самих номеров дат, и мы переписываем номера дат так, чтобы они представляли собой строковые представления самих времен.
После того, как мы запустим код выше, мы получаем:
Поскольку шаг по времени в промежутках между настолько мал, он может загромождать горизонтальную ось, как метки длинны, но интервал короткая. Таким образом, вы можете рассмотреть только отображение времени на определенном интервале, и вы можете сделать это, делая что-то вроде:
step_size = 5;
plot(datenums, mags);
set(gca, 'XTick', datenums(1:step_size:end));
set(gca, 'XTickLabel', datestr(1:step_size:end));
step_size
управления, сколько тиков и метки появляются последовательно. Очевидно, что вам необходимо убедиться, что step_size
меньше, чем общее количество точек в ваших данных.
Для вашего копирования и вставки удовольствия, это то, что полный код, который я написал, как выглядит:
%// Load in each row as a cell array
A = importdata('data.txt');
%// Each row has , replaced with .
Arep = regexprep(A, ',', '\.');
Arep_decomp = regexp(Arep, '[^;]+', 'match');
datestr = cellfun(@(x) x{1}, Arep_decomp, 'uni', 0);
datenums = cellfun(@(x) datenum(x, 'HH:MM:SS.FFF'), datestr);
mags = cellfun(@(x) str2double(x{2}), Arep_decomp);
step_size = 1;
%step_size = 5;
plot(datenums, mags);
set(gca, 'XTick', datenums(1:step_size:end));
set(gca, 'XTickLabel', datestr(1:step_size:end));
Так что именно вы хотите импортировать? Какие количества для каждой строки? Очень неясно, что вы хотите сделать. – rayryeng
Обновите свой вопрос с помощью этой новой информации. – rayryeng