【问题标题】:Importdata function导入数据功能
【发布时间】:2015-03-25 17:42:07
【问题描述】:

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

我在几年前查找过有关此问题的问题,但尚未真正得到解答。根据这些建议,我尝试过:data_temp = cell2mat(textscan(fopen('P:\FileName))) 引入了一个空矩阵,以及“加载”函数与“导入数据”。加载功能失败,因为我的数据每行的列数不同。

那么有人知道引入最后几行数据的功能/解决方法吗?

{我不想使用 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
第一帧:222 第 2 帧:327 事件:LTO
帧数:2
第一帧:181 第 2 帧:283 事件:RHS
帧数:2
第一帧:169 第 2 帧:274 事件:RTO
帧数:1
第一帧:232 事件:LHS FP
帧数:1
第一帧:222 事件:RHS FP
帧数:1
第 1 帧:169

感谢您的宝贵时间和帮助!

【问题讨论】:

    标签: matlab nan


    【解决方案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

    【讨论】:

    • 这是当您的数据格式复杂时的后备方法。但是请注意,最好使用~feof(fid) 检查退出条件。另请注意,根据输入文件的大小,使用fread 一次读取一个数据块可能更有效,然后解析成行进行进一步处理。
    • @TimeString 感谢您的评论。我从 matlab 示例/帮助部分看到了您的代码,我认为经过一些调整后,这将满足我的需要。我想我必须通过 importdata 引入数字数据(我的脚本已经完全按照我需要的方式处理数据),但我必须为我的事件数据找出这个“fid”的东西。
    • @Setsu 谢谢。我几乎已经为数字数据编写了整个脚本,并且它可以完美导入。我只需要最近添加到文件中的额外信息。所以我可能会在数值数据停止后使用“fgets”插入行,一直到文件末尾(数值数据后面有一个空格,我可能会向 matlab 发出信号)。
    【解决方案2】:

    您可以通过 MATLAB 的导入函数“importdata”导入 .data 文件,但它不会导入不是标题的文本。此代码打开并逐行扫描文件以搜索文本“事件”。 (我不能把这段代码归功于我 - 我的朋友为我写的,但我想把它发布给试图做同样事情的人)

    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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-22
      • 1970-01-01
      • 1970-01-01
      • 2021-01-20
      • 1970-01-01
      • 2013-12-25
      • 2021-11-29
      相关资源
      最近更新 更多