2014-01-22 256 views
1

我正在使用“[dhvct] = textread(fn,'%s%* s%s%f%s%s')在Matlab中恢复原来的脚本。 ;”要导入数据,我想用textscan替换textread,因为这似乎是推荐的。Matlab想使用textscan跳过少于1个列的行

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

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

31/12/1991 00:00:00 @ Q25 T2
1992年1月1日00:00:00 @ Q25 T2
02/01/1992 @ 00:00:00 24.451330 Q25 T2
1992年3月1日00:00:00 @ Q25 24.674587 T2
1992年4月1日00:00:00 @ Q25 25.264880 T2

由于

+1

您是否需要所有的值,特别是Q25和T2之后的值?数据中是否有任何内容值,例如Q25总是Q25还是始终以Q开头?为了调整这些情况下的“textscan”,需要了解一些数据。 – horchler

+0

嗨,我确实需要所有列,并且数字更改,但Q和T始终是这些列的第一个字母/数字 – user2738526

回答

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'被分成数字NaN和字符串'25',有效地添加一列。第五列中的'Q25'元素不重要,因为它们被扫描为字符串。所以如果字母'Q'出现在数据的其他地方应该没问题。

+0

谢谢,作品魅力 – user2738526