【问题标题】:Matlab (textscan), read characters from specified column and rowMatlab(textscan),从指定的列和行读取字符
【发布时间】:2016-08-29 20:12:28
【问题描述】:

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

%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

【问题讨论】:

    标签: matlab textscan


    【解决方案1】:

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

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

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

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

    更新

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

    frewind(fid)
    

    【讨论】:

    • 感谢您的回复!我尝试使用 regexp 和 fgetl,但无法使其工作。最后,我在 shell (awk) 中完成了这个,这对我来说更容易,因为我习惯于在 unix 中工作(但我我正在学习matlab,所以这仍然很有用)
    • @Neuroguy 你能发布你的实际文件吗?显然它不是你想的那样。
    • 我粘贴了文件中的内容,但由于某种原因,缺少一些换行符,所以看起来不同..无论如何,现在只对顶行感兴趣,所以也许这会做..在这里上传实际文件是否需要付费?
    • @Neuroguy 如果您将刚刚粘贴到问题中的内容复制/粘贴到一个新文件中,然后尝试运行您的代码,它可以工作吗?
    • 我现在试了,结果一样.. 以一个空单元格结束
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    相关资源
    最近更新 更多