Importdata功能

时间:2015-03-25 17:42:07

标签: matlab nan

我正在尝试导入数字数据以及最近添加到该文件的ASCI信息。我可以很好地将数值数据导入到数据结构中,但MATLAB(R2014a)的importdata函数甚至无法识别写入的(事件)数据。

几年前我已经查询过有关这个问题的问题但是他们还没有真正得到回答。根据这些建议,我试过:data_temp = cell2mat(textscan(fopen('P:\FileName)))带来一个空矩阵,'load'函数对'importdata'。加载函数失败,因为我的数据每行的列数不同。

那么有人知道一个函数/解决方法来引入最后几行数据吗?

{我不想使用ImportWizard,因为这需要手动选择,我正在编写一个用户友好的代码,通过GUI输入数据文件}

这是一个示例数据文件 - 包含数字数据的行1:412和事件数据的行413:437:

409 0.000000 0.000000 0.000000 0.000000

410 0.000000 0.000000 0.000000 0.000000

411 0.000000 0.000000 0.000000 0.000000

412 0.000000 0.000000 0.000000 0.000000

事件:LHS
    帧数:2
        第1帧:222         第2帧:327 事件:LTO
    帧数:2
        第1帧:181         第2帧:283 事件:RHS
    帧数:2
        第1帧:169         第2帧:274 事件:RTO
    帧数:1
        第1帧:232 事件:LHS FP
    帧数:1
        第1帧:222 事件:RHS FP
    帧数:1
        第1帧:169

感谢您的时间和帮助!

2 个答案:

答案 0 :(得分:1)

我不确定你的最终目标,因为这不是纯数字文件,即某些数字在事件块中的行内混合。因此,我不确定是否要在行内提取数字,或者只是询问如何读取所有行并存储在一个变量中,如python中的readlines()。我假设你问的是落入后者的。我猜你可以fgets()读取每一行,然后存储在一个单元格变量中。因此代码的骨架将是:

fid = fopen('filename.txt', 'r');
lines = {};
tline = fgets(fid);
while ischar( lines{end} )
    lines{end+1} = tline;
    tline = fgets(fid);
end
fclose(fid);

最终结果存储在'lines'变量中,如果需要,您可以进一步解析它们。

参考。 http://www.mathworks.com/help/matlab/ref/fgets.html

答案 1 :(得分:1)

您可以通过MATLAB的导入功能导入.data文件' importdata'但它不会导入不是标题的文本。此代码会逐行打开并扫描文件,搜索文本'事件'。 (我不能因为这段代码而受到赞誉 - 我的朋友为我写了这封代码,但我想把它发布给那些试图做同样事情的人)

fn = ('file.data');

B = importdata(fn);
fid = fopen(fn);
tline = fgets(fid);
D=[];
while ischar(tline)  % while not at the end of file
    if strncmp(tline,'Event',5) % If the first 5 letters are 'Event'
        Evt=strtrim(strsplit(tline,'\t')); % find event name
        Evt=Evt{2};

    Nb = fgets(fid); % Get the number of frames
    Nb=sscanf(Nb,'  Number of Frames:   %d');
   F=[];
    for f=1:Nb % For each frame, get the frame number
        ln = fgets(fid);
        F(f)=sscanf(ln,['       Frame ' num2str(f) ':   %d']);
    end 
    D(end+1).Name   = Evt;
    D(end).Frames = F;
end
tline = fgets(fid);
end
fclose(fid);