【问题标题】:How do I read the rest of a line of a text file in MATLAB with TEXTSCAN?如何使用 TEXTSCAN 在 MATLAB 中读取文本文件的其余行?
【发布时间】:2018-02-27 08:07:33
【问题描述】:

我正在尝试根据特定格式读取包含数据的文本文件。我正在使用和textscan 以及一个包含格式的字符串,以便在一个代码行中读取整个数据集。我已经找到了如何使用fgetl 阅读整行代码,但我想使用尽可能少的代码行。所以我想避免自己的for循环。 textscan 似乎很适合。

作为示例,我将包含我的代码的一部分,它读取代表修改后的数据集的五个字符串、其遗产(旧数据集的名称)、修改的日期和时间,最后是任何注释。

fileID = fopen(filePath,'r+');
readContentFormat = '%s = %s | %s %s | %s';
content = textscan(fileID, readContentFormat, 'CollectOutput,1);

如果评论中没有任何分隔符(如空格),这暂时有效。但是,我希望能够在行尾写 cmets。

有没有办法使用 textscan 并让它知道我想将一行的其余部分读取为一个字符串/字符数组(包括任何空格)?我希望将一些东西放入我的变量readContentFormat,而不是最后一个%s。还是有另一种方法不涉及遍历文件中的每一行?

此外,即使我的数据非常有限,我也很想知道不同方法在计算效率或稳定性方面的优缺点。如果您知道您认为值得分享的内容,请分享。

【问题讨论】:

    标签: matlab text-files line fopen textscan


    【解决方案1】:

    一种令我满意的方法(但请分享任何其他方法!)是将分隔符设置为除空格以外的字符,并使用strtrim 修剪掉任何前导或尾随空格。这似乎运作良好,但我不知道计算的要求有多高。


    示例:

    当前文件夹中的文本文件'testFile.txt'有以下几行

    文件 |遗产 |日期和时间 |评论 文件1.mat | oldFile1.mat | 2018-03-01 14:26:00 | - 文件2.mat | oldFile2.mat | 2018-03-01 13:26:00 | - 文件3.mat | oldFile3.mat | 2018-03-01 12:26:00 |午餐时间!

    以下代码将读取数据并将其放入元胞数组中,无需前导或尾随空格,只需几行代码。整洁!

    function contentArray = myfun()
       fileID = fopen(testFile.txt,'r');
       content = textscan(fileID, '%s%s%s%s','Delimiter', {'|'},'CollectOutput', 1);
       contentArray =  strtrim(content{1}(2:4,:));
    end
    

    输出:

    tmpArr =
    
      3×4 cell array
    
        'file1.mat'    'oldFile1.mat'    '2018-03-01 14:26:00'    '-'            
        'file2.mat'    'oldFile2.mat'    '2018-03-01 13:26:00'    '-'
        'file3.mat'    'oldFile3.mat'    '2018-03-01 12:26:00'    'Time for lunch!' 
    

    【讨论】:

      猜你喜欢
      • 2013-09-12
      • 2016-07-20
      • 1970-01-01
      • 2017-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多