我正在尝试根据特定格式读取包含数据的文本文件。我正在使用和textscan
一起使用包含格式的字符串来读取一个代码行中的整个数据集。我已经找到了如何用fgetl
读取整行,但我想尽可能少使用代码行。所以我想避免自己的for循环。 textscan
似乎很棒。
作为一个例子,我将包括我的代码的一部分,其中读取代表修改的数据集的五个字符串,其遗产(旧数据集的名称),修改的日期和时间以及最后的任何评论。
fileID = fopen(filePath,'r+');
readContentFormat = '%s = %s | %s %s | %s';
content = textscan(fileID, readContentFormat, 'CollectOutput,1);
如果评论中没有任何分隔符(如空格),这暂时适用。但是,我希望能够在行尾写下评论。
有没有办法使用textscan
并让它知道我想读取一行的其余部分作为一个字符串/字符数组(包括任何空格)?我希望能在我的变量readContentFormat
中放入一些东西,而不是最后的%s
。或者是否有另一种方法不涉及循环文件中的每一行?
此外,即使我的数据非常有限,我也很想知道有关计算效率或稳定性的不同方法的任何优缺点。如果你知道你认为值得分享的东西,请这样做。
一种令我满意的方法(但请分享任何其他方法!)是将分隔符设置为除空格之外的字符,并使用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!'