【问题标题】:Matlab: How to read commented portion of ascii fileMatlab:如何读取 ascii 文件的注释部分
【发布时间】:2013-06-30 02:25:47
【问题描述】:

我有一个 ascii 文件,它的前几百行被注释(后面是数据),提供有关数据的一些信息。例如,这些是我从大量注释的行中剪下的几行:

现在我只使用load 读取没有 cmets 的数据:

filename = uigetfile('*.dat', 'Select Input data');
Data = load(filename, '-ascii');

如何阅读注释行(在数据开始之前结束)并根据一些标识从所有 cmets 中挑选一些 cmets,例如 程序名称和版本创建日期 等等?

【问题讨论】:

  • 我对你的文件格式有点困惑。其他每一行都以注释开头还是您只是在这里注释了这些行?
  • 感谢您指出这一点。现在已经修好了..

标签: matlab comments text-parsing


【解决方案1】:

使用textscan 将行读入元胞数组:

fid = fopen(filename, 'r');
C = textscan(fid, '%s', 'Delimiter', '\n');
C = C{:};  %// Flatten cell array
fclose(fid);

现在您可以使用regexp 来操作文本数据。例如,要查找包含字符串“创建日期”的注释行,您可以这样做:

idx = ~cellfun('isempty', regexp(C, "^\s*%.*Creation date"));

其中“^\s*% 匹配行首的百分号 (%) 以及任何前导空格,.* 匹配任意数量的字符,直到出现“创建日期”。无需比如说,你可以根据自己的喜好调整regular expression 模式。

结果变量idx 存储了一个逻辑(ie 布尔)向量,在与模式匹配的行的位置带有“1”(您可以使用find(idx) 获得它们的显式数字索引)。接下来,您可以使用 C(idx) 过滤这些行或使用 for 循环对其进行迭代。

【讨论】:

    【解决方案2】:
    fid = fopen(filename); 
    nHeaderRows = 412; 
    headerCell = cell(nHeaderRows, 1); 
    for i=1:nHeaderRows 
        headerCell{i} = fgets(fid); 
    end 
    headerText = char(headerCell);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-15
      • 1970-01-01
      • 2017-09-07
      • 1970-01-01
      • 2018-11-29
      • 1970-01-01
      • 2016-10-30
      • 1970-01-01
      相关资源
      最近更新 更多