如何使用 TEXTSCAN 在 MATLAB 中读取文本文件的一行的其余部分?

How do I read the rest of a line of a text file in MATLAB with TEXTSCAN?

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

作为示例,我将包括我的代码的一部分,它读取代表修改后的数据集的五个字符串、它的继承(旧数据集的名称)、修改的日期和时间以及最后的任何评论。

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

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

有没有办法使用 textscan 并让它知道我想将一行的其余部分作为一个 string/character 数组读取(包括任何白色 spaces)? 我希望将一些东西放入我的变量 readContentFormat,而不是最后一个 %s。或者是否有另一种方法不涉及循环遍历文件中的每一行?

此外,尽管我的数据非常有限,但我很想知道不同方法在计算效率或稳定性方面的优缺点。如果你知道一些你认为值得分享的东西,请分享。

一种令我满意的方法(但无论如何请分享任何其他方法!)是将分隔符设置为白色以外的字符 space,并且 trim 去掉任何前导或尾随的白色spaces 与 strtrim。这似乎工作得很好,但我不知道计算量有多大。


示例:

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

    File        |Heritage       |Date and time         |Comment
      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!
 

以下代码将读取数据并将其放入元胞数组中,没有前导或尾随白色 spaces,代码行很少。整洁!

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!'