Matlab(textscan),从指定的列和行中读取字符

时间:2016-08-29 20:12:28

标签: matlab textscan

我有许多带有数据的文本文件,并且想要读取每个文件的特定部分(时间信息),它始终位于每个文件的第一行的末尾。这是一个例子:

%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

1 个答案:

答案 0 :(得分:3)

如果你没有读完整个文件,你可以使用fgetl读取第一行,拆分字符串(使用regexp),然后抓住最后一个元素。

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

话虽如此,如果您的文件实际上是您的说法,那么您使用textscan的方式似乎没有任何问题。您可以选择执行以下操作:

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

<强>更新

另外,在尝试解析文件之前,请确保使用frewind回滚文件指针,以确保它从文件顶部开始。

frewind(fid)