如何使用 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!'
我正在尝试根据特定格式读取包含数据的文本文件。我将 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!'