1

我在 Matlab 中恢复了一个旧脚本,它使用“[dhvct] = textread(fn,'%s %*s %s %f %s %s');” 要导入数据,我想用 textscan 替换 textread,因为这似乎是推荐的。

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

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

1991 年 12 月31 日 @ 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

谢谢

4

1 回答 1

1

好的,这有点小技巧,但它确实有效。textscan可以比其他方法快得多,如果您的数据有特定的限制,通常值得尝试一下。

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

您会看到这t{3}是一个 5×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'被分解为 numberNaN和 string '25',有效地添加了一列。第五列中的'Q25'元素无关紧要,因为它们被扫描为字符串。所以如果字母'Q'出现在数据的其他地方应该没问题。

于 2014-01-23T00:46:15.793 回答