Matlab希望使用textscan跳过少一列的行

时间:2014-01-22 23:52:34

标签: matlab import textscan

我正在使用“[d h v c t] = textread(fn,'%s%* s%s%f%s%s')”恢复Matlab中的旧脚本;“要导入数据,我想用textcan替换textread,因为这似乎是推荐的。

我的问题(旧的和新的)是我的第四列数据 - 浮点值 - 在它中有一些空白。由于空格是我的分隔符,这意味着matlab尝试插入包含字母作为浮点值的第五列,因此给出了错误。

有关如何使其自动跳过没有值的行的任何建议?我有大约100个文件需要定期更新,因此手动方法太耗时。我的数据看起来像这样但是很长一段时间:

31/12/1991 @ 00:00:00 Q25 T2
01/01/1992 @ 00:00:00 Q25 T2
02/01/1992 @ 00:00:00 24.451330 Q25 T2
03/01/1992 @ 00:00:00 24.674587 Q25 T2
04/01/1992 @ 00:00:00 25.264880 Q25 T2

由于

1 个答案:

答案 0 :(得分:1)

好的,这有点像黑客,但它确实有效。 textscan可能比其他方法快得多,如果您的数据有特殊限制,通常值得玩一下。

fid = fopen('test.txt');
t = textscan(fid,'%s%*s%s%f%s%s','TreatAsEmpty','Q');
fclose(fid);
t{:}

您会看到t{3}是一个5 x 1的数组,其空值为默认NaN。但是,由于t{4}缺少前两个元素的前导'Q',您仍需要再做一件事。可能有几种方法可以实现这一点,但这里有一个简单的单行程序,它使用isnan索引到需要添加'Q'的行:

t{4}(isnan(t{3})) = cellfun(@(c)['Q' c],t{4}(isnan(t{3})),'UniformOutput',false);


如何使用'TreatAsEmpty'参数?

在第四列(第三列非跳过列)的情况下,我们正在处理数字字段。此选项仅适用于检测数字字段('%f')时。字符串'Q25'分为数字NaN和字符串'25',有效地添加了一列。第五列中的'Q25'元素无关紧要,因为它们被扫描为字符串。如果字母'Q'出现在数据的其他地方,那应该没问题。