Neuroguy
Neuroguy

Reputation: 141

Matlab (textscan), read characters from specified column and row

I have a number of text files with data, and want to read a specific part of each file (time information), which is always located at the end of the first row of each file. Here's an example:

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

I.e. I would like to get "12:27:20".

I've tried using textscan, which I have used before for similar problems. I figured there are 3 columns of this row, with single white space as delimiter.

I first tried to specify these as strings (%s):

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

I also tried to specify the date and time using datetime format:

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

Both of these just produce a blank cell. (I've also tried a number of variations, such as defining the delimiter as ' ', with the same result)

Thanks for any help!

Here's the entire file (not sure pasting here is the right way to do this - i'm new to both matlab and 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

Upvotes: 1

Views: 443

Answers (1)

Suever
Suever

Reputation: 65430

If you're not reading in the entire file, you could just read the first line using fgetl, split on the strings (using regexp) and then grab the last element.

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

That being said, there doesn't seem to be anything wrong with the way you're using textscan if your file is actually how you say. You could alternately do something like:

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

Update

Also, be sure to rewind the file pointer using frewind before trying to parse the file to ensure that it starts at the top of the file.

frewind(fid)

Upvotes: 3

Related Questions