Matlab 减少textscan中的表达式

Matlab 减少textscan中的表达式,matlab,Matlab,关于以下数据: 学生ID |测试1 |测试2 |测试3 191.5 89.2 77.3 288.067.891.0 376.378.192.5 4 96.4 81.2 84.6 如果我使用 fileID = fopen('grades.txt'); formatSpec = '%s'; N = 4; C_text = textscan(fileID, formatSpec, N, 'delimiter', '|'); Matlab将使用'%s'格式读取列标题四次 但是我怎样才能用一种更简单的方

关于以下数据:

学生ID |测试1 |测试2 |测试3

191.5 89.2 77.3

288.067.891.0

376.378.192.5

4 96.4 81.2 84.6

如果我使用

fileID = fopen('grades.txt');
formatSpec = '%s';
N = 4;
C_text = textscan(fileID, formatSpec, N, 'delimiter', '|');
Matlab将使用
'%s'
格式读取列标题四次

但是我怎样才能用一种更简单的方式来写作呢

textscan(文件ID,'%f%f%f%f%f%f%f%*f%f%f%f%f%f%f%f','delimiter','|')

如果要读取前七个浮点值,请忽略第八个浮点值并读取最后七个浮点值?

一种方法是动态生成格式字符串,而不是硬编码:

formatSpec = [repmat('%f', 1, 7), '%*f', repmat('%f', 1, 7)];
然后,您可以将此格式字符串传递到
textscan

另一种方法是将带有数字的行作为字符串读取,然后使用
str2num
将它们转换为数值,并丢弃您不需要的列,如下所示:

C = textscan(fileID, '%s', 'delimiter', '\n');
vals = cell2mat(cellfun(@str2num, C{:}, 'UniformOutput', false));
vals(:, 8) = [];
p.S

你知道
textscan
有一个
HeaderLines
选项可以跳过文件开头的行吗?

问题是我处理的文件没有标题。@bigTree那么你会如何调用文件中的第一行?实际上,生成文件的人刚刚给我发送了一个没有标题的版本(但事实上,在原始文件中,第一行有标题)