Разделение метки времени в Matlab

У меня есть файл со значением данных и отметкой времени, который я пытаюсь разделить в Matlab. Это формат:

-18.151346    Mon Jan 28 11:33:08 2013

Я использую функцию textscan, чтобы попытаться разделить ее.

data=textscan(fid,'%f%s%s%f%s%n','delimiter','space');

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

Column 1     Column 2   Column 3 
-18.151346   Mon       Jan 28 11:33:08 2013

Я совершенно новичок в Matlab, поэтому любая помощь будет принята с благодарностью. Заранее спасибо.


person Bob    schedule 28.01.2013    source источник


Ответы (2)


  1. Вы используете строку 'space' в качестве разделителя, что недопустимо в textscan. Вместо этого укажите его как ' '.
  2. Вы хотите рассматривать последовательные пробелы как одно, поэтому вам также следует установить флаг 'MultipleDelimsAsOne' равным 1.

Правильный синтаксис должен быть:

textscan( fid, '%f%s%s%s%s%n', 'delimiter', ' ', 'MultipleDelimsAsOne', 1);

Если бы вы не пытались возиться с параметром разделителя, это поведение было бы выполнено правильно по умолчанию, поэтому просто опустите все параметры:

textscan( fid, '%f%s%s%s%s%n');

Также обратите внимание, что вам нужен флаг для каждого элемента в строке, окруженной пробелами. Другими словами, для такой строки:

-18.151346 Пн 28 января 11:33:08 2013

временная метка в виде строки будет храниться в 5-м столбце результирующего массива ячеек.

person slayton    schedule 28.01.2013
comment
+1: Кроме того, звездочку можно использовать для игнорирования столбцов, поэтому использование '%*f %*s %*s %*s %*s %*n' в качестве строки формата позволяет извлечь только время. - person Eitan T; 28.01.2013
comment
Использование предоставленного вами формата (и различных других комбинаций) оставляет мне тот же результат, что и раньше. Использование звездочки, чтобы попытаться изолировать время, просто оставляет мне пустую таблицу данных. В моем втором столбце написано «Mon J», так что, как будто он не распознает пробел в качестве разделителя? - person Bob; 28.01.2013
comment
@Bob Боб, вы неправильно указали разделитель, обратитесь к исправленному ответу. Кроме того, простите меня за то, что я поставил лишнюю звездочку в строке формата, вместо этого используйте это: '%*f %*s %*s %*s %s %*n'. Я протестировал его, и теперь он работает. - person Eitan T; 28.01.2013
comment
Да! Исключение всех опций работает отлично, большое спасибо. - person Bob; 28.01.2013

Чтобы прочитать метку времени, я бы использовал regexp.

Решение, которое я посоветую, можно оптимизировать, но оно может помочь вам хотя бы при первой попытке.

A = regexp(str,'[^\s]+','match');

Таким образом, вы сопоставите все регулярные выражения в вашей строке. Затем вы знаете, что values и time хранятся как элементы 1 и 5.

Я сделал короткий тест с:

cell = {'-18.151346 Mon Jan 28 11:33:08 2013','19.33333 Tue Feb 29 10:12:23 2012'};

и это приведет вас к ячейке A{1,2}.

Опять же, эту процедуру можно усовершенствовать, но вы можете использовать ее как подсказку.

person fpe    schedule 28.01.2013
comment
Это может сработать. Мне нужно отобразить значение (-18,151346) в зависимости от времени (11:33:08), так что есть ли способ извлечь оба сразу. Кроме того, этот столбец является частью файла результатов с 1440 записями, так что самый простой способ обработать их все сразу. Если я создам массив ячеек со всеми данными, а затем скрою его в матрицу и вызову его по одной строке за раз, это сработает? Или есть более простой способ? - person Bob; 28.01.2013
comment
имеют ли значения стандартное количество цифр? - person fpe; 28.01.2013
comment
Я использую первое решение, так как оно лучше соответствует тому, что я пытаюсь сделать. Спасибо за ваш вклад. - person Bob; 28.01.2013