1

像这样的数据:

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

1 91.5 89.2 77.3

2 88.0 67.8 91.0

3 76.3 78.1 92.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(fileID, '%f %f %f %f %f %f %f %*f %f %f %f %f %f %f %f', 'delimiter', '|'); 我想在哪里阅读前七个花车,忽略第八个并阅读最后七个花车?

4

1 回答 1

2

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

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) = [];

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

于 2013-07-08T15:18:38.427 回答