Matlab (текстовое сканирование), чтение символов из указанного столбца и строки

У меня есть несколько текстовых файлов с данными, и я хочу прочитать определенную часть каждого файла (информация о времени), которая всегда находится в конце первой строки каждого файла. Вот пример:

%termo2, 30-Jan-2016 12:27:20

т.е. Я хотел бы получить "12:27:20".

Я пытался использовать textscan, который я использовал раньше для подобных проблем. Я понял, что в этой строке есть 3 столбца с одним пробелом в качестве разделителя.

Сначала я попытался указать их как строки (%s):

fid = fopen(fname);
time = textscan(fid,'%s %s %s');

Я также попытался указать дату и время, используя формат даты и времени:

time = textscan(fid,'%s %{dd-MMM-yyyy}D %{HH:mm:ss}D')

Оба они просто создают пустую ячейку. (Я также пробовал несколько вариантов, таких как определение разделителя как ' ', с тем же результатом)

Спасибо за любую помощь!

Вот весь файл (не уверен, что вставка здесь - правильный способ сделать это - я новичок как в Matlab, так и в stackoverflow ..):

%termo2, 30-Jan-2016 12:27:20

%
%102
%

%stimkod    stimtyp
%      1    Next:Pain
%      2    Next:Brush
% vaskod    text
%      1     Obeh ->  Beh
%      2     Inte alls intensiv ->  Mycket intensiv

% stimnr    starttid     stimkod      vaskod    VASstart     VASmark         VAS
       1      78.470           2           1      96.470     100.708       6.912
       1      78.470           2           2      96.470     104.739       2.763
       2     138.822           1           2     156.821     162.619       7.615
       2     138.822           1           1     156.821     166.659       2.496
       3     199.117           2           2     217.116     222.978       2.897
       3     199.117           2           1     217.116     224.795       5.773
       4     258.612           2           1     276.612     280.419       5.395
       4     258.612           2           2     276.612     284.145       4.622
       5     320.068           1           1     338.068     340.689       4.396
       5     320.068           1           2     338.068     346.090       2.722
       6     377.348           1           2     395.347     398.809       6.336
       6     377.348           1           1     395.347     404.465       3.391
       7     443.707           2           1     461.707     464.840       6.604
       7     443.707           2           2     461.707     473.703       3.652
       8     503.122           1           2     521.122     526.009       4.285
       8     503.122           1           1     521.122     529.808       3.646
       9     568.546           2           2     586.546     586.546       5.000
       9     568.546           2           1     586.546     595.496       6.412
      10     629.953           2           1     647.953     650.304       7.034
      10     629.953           2           2     647.953     655.600       6.615
      11     694.305           1           1     712.305     714.416       4.669
      11     694.305           1           2     712.305     721.079       2.478
      12     751.537           2           2     769.537     773.511       7.307
      12     751.537           2           1     769.537     777.423       8.225
      13     813.944           1           2     831.944     834.958       7.731
      13     813.944           1           1     831.944     839.255       1.363
      14     872.448           2           1     890.448     893.829       6.813
      14     872.448           2           2     890.448     899.439       2.600
      15     939.880           1           2     957.880     963.811       4.332
      15     939.880           1           1     957.880     966.603       2.786
      16     998.328           2           1    1016.327    1020.707       5.837
      16     998.328           2           2    1016.327    1025.275       2.664
      17    1062.911           1           2    1080.910    1082.967       2.792
      17    1062.911           1           1    1080.910    1088.674       4.094
      18    1125.182           1           1    1143.182    1144.379       0.619
      18    1125.182           1           2    1143.182    1151.786       8.992

person Neuroguy    schedule 29.08.2016    source источник


Ответы (1)


Если вы не читаете весь файл, вы можете просто прочитать первую строку, используя fgetl, разделить строки (используя regexp), а затем взять последний элемент.

parts = regexp(fgetl(fid), '\s+', 'split');
last = parts{end};

При этом кажется, что нет ничего плохого в том, как вы используете textscan, если ваш файл действительно такой, как вы говорите. Вы можете поочередно сделать что-то вроде:

parts = textscan(fid, '%s', 3);
last = parts{end}

Обновить

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

frewind(fid)
person Suever    schedule 29.08.2016
comment
Спасибо за ответ! Я пробовал играть с regexp и fgetl, но не смог заставить это работать. В конце концов, я сделал это в оболочке (awk), что было проще для меня, так как я привык работать в unix (но я изучаю матлаб, так что это еще пригодилось) - person Neuroguy; 30.08.2016
comment
@Neuroguy Можете ли вы опубликовать свой настоящий файл? Ясно, что это не то, что вы думаете. - person Suever; 30.08.2016
comment
я вставил то, что было в файле, но по какой-то причине некоторые разрывы строк отсутствуют, поэтому он выглядит иначе.. в любом случае, пока интересует только верхняя строка, так что, возможно, это подойдет. собственно файл здесь? - person Neuroguy; 30.08.2016
comment
@Neuroguy Если вы скопируете / вставите то, что вы только что вставили в свой вопрос, в новый файл, а затем попытаетесь запустить свой код, это сработает? - person Suever; 30.08.2016
comment
Я попробовал сейчас, и тот же результат. В итоге пустая ячейка - person Neuroguy; 30.08.2016
comment
@Neuroguy А вы уверены, что ничего не читаете из файла, прежде чем пытаться обработать его с помощью textscan? Если вы это сделаете, вы должны сначала позвонить frewind(fid) - person Suever; 30.08.2016
comment
да! это решило это, большое спасибо! Как вы и предположили, мой сценарий читал последующие строки ранее - я не осознавал, что он продолжается с того места, где он последний раз читал (остановился). Это был полезный урок - еще раз спасибо! - person Neuroguy; 31.08.2016
comment
@Neuroguy Я добавил это пояснение к ответу выше. - person Suever; 31.08.2016