我正在使用“[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
由于
答案 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'
出现在数据的其他地方,那应该没问题。