【问题标题】:reading in a file with textscan and ignoring certain lines使用 textscan 读取文件并忽略某些行
【发布时间】:2014-06-18 20:11:51
【问题描述】:

我有一个输入文件,其中包含这样的整数行:

1 2 3
4 5 6
7 8 9

我想读入文件,我以前用过textscan功能来完成这种任务。 但是数据中有几行(随机位置)包含双数,例如

<large number of integer lines>
0.12 12.44 65.34
<large number of integer lines>

读取文件时,我想忽略这些行。这样做的最佳方法是什么?我可以告诉 textscan 忽略某些模式吗?

【问题讨论】:

  • 为什么不将所有数据读取为整数,然后使用isfloat删除浮点值
  • 你能举个例子如何做到这一点吗?

标签: matlab


【解决方案1】:

formatSpec 参数可能是您要搜索的参数: http://www.mathworks.de/de/help/matlab/ref/textscan.html#inputarg_formatSpec

如果内容与给定格式不匹配,它将终止读取。如果您对同一个文件再次调用 textscan,它必须从上次终止的位置开始读取。

来自链接网站:

如果您通过调用 textscan 来恢复文件的文本扫描 文件标识符(fileID),然后 textscan 自动恢复读取 在它终止最后一次读取的位置。

【讨论】:

    【解决方案2】:

    一种选择是简单地将所有内容作为浮点数读取 - 使用 textscan 或者如果您的数据都是数字 dlmread 或类似的可能更简单。

    然后只需删除您不想要的行:

    data =
    
        1.0000    2.0000    3.0000
        4.0000    5.0000    6.0000
        0.1200   12.4400   65.3400
        7.0000    8.0000    9.0000
    
     data(data(:,1)~=round(data(:,1)),:)=[]
    
    data =
    
         1     2     3
         4     5     6
         7     8     9
    

    如果您以后的代码要求您的数据矩阵类型为非浮点型,此时使用uint8 或类似方法进行转换。

    【讨论】:

    • 如果文件中有1.0 2.0 3.0这样的行怎么办?
    【解决方案3】:

    假设您不知道带有浮点数的行的位置和数量,并且您不想要 1.0 2.0 3.01 2 3.0 这样的行,我的想法是逐行读取文件,而不是存储包含. 字符的行。

    fid = fopen('file.txt');
    nums = [];
    line = fgetl(fid);
    while line ~= -1 % #read until end of file
        if isempty(strfind(line, '.'))
            line = textscan(line, '%d %d %d');
            nums = [nums; line{:}];
        end
        line = fgetl(fid);
    end
    fclose(fid);
    

    nums 是包含您的数据的矩阵。

    【讨论】:

    • 我想知道这个任务是否有一个很好的非迭代解决方案。
    猜你喜欢
    • 2012-06-08
    • 1970-01-01
    • 2012-01-18
    • 2011-03-21
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    相关资源
    最近更新 更多