如何避免在matlab中为导入数据忽略长文本文件的重复段落

时间:2014-03-17 16:39:11

标签: matlab

我正在尝试从txt文件导入所有double,该文件具有此格式

#25x1 string

#9999x2 double
.
.
.

#(repeat ten times)

但是,当我尝试使用导入向导时,只有第一个

25x1 string
9999x2 double.

成功加载,其他9个被忽略

我如何导入所有数据? (importdata有最大长度还是什么?) 感谢

1 个答案:

答案 0 :(得分:2)

这与最大长度无关,importdata只是没有为您描述的数据文件类型设置。从帮助文件:

  

对于ASCII文件和电子表格,importdata需要   以矩形形式(即,像矩阵)查找数字数据。   文本标题可以显示在数字数据的上方或左侧,   如下:

     

上面文件顶部的列标题或文件描述文本   数字数据。数字数据左侧的行标题。

所发生的事情是,正在读取文件的第一部分,它与importdata期望的格式相匹配,其余部分被忽略。而不是importdata,您需要使用textscan,尤其是这种风格:

C = textscan(fileID,formatSpec,N)

fileIDfopen返回。 formatspec告诉textscan期待什么,以及N重复多少次。只要fileID保持打开状态,对textscan的重复调用将继续从上次读取操作停止的任何位置读取文件 - 而不是返回到文件的开头。所以我们可以这样做:

fileID = fopen('myfile.txt');
repeats = 10;

for n = 1:repeats

    % read one string, 25 times
    C{n,1} = textscan(fileID,'%s',25); 
    % read two floats, 9999 times
    C{n,2} = textscan(fileID,'%f %f',9999);

end

然后,您可以从单元格数组中提取数值数据(如果您需要在一个块中使用它,则可能需要尝试使用'CollectOutput',1作为选项)。