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

问题描述 投票:1回答:1

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

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

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

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

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

此外,即使我的数据非常有限,我也很想知道有关计算效率或稳定性的不同方法的任何优缺点。如果你知道你认为值得分享的东西,请这样做。

matlab text-files line fopen textscan
1个回答
0
投票

一种令我满意的方法(但请分享任何其他方法!)是将分隔符设置为除空格之外的字符,并使用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!
 

下面的代码将读取数据并将其放入单元数组中,而不使用前导或尾随空格,只需几行代码。整齐!

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!' 
© www.soinside.com 2019 - 2024. All rights reserved.