【问题标题】:Matlab: how handle abnormal data filesMatlab:如何处理异常数据文件
【发布时间】:2011-04-06 05:44:46
【问题描述】:

我正在尝试将大量文件导入 Matlab 进行处理。典型的文件如下所示:

    mass      intensity
 350.85777         238
 350.89252        3094
 350.98688        2762
 351.87899         468
 352.17712         569
 352.28449         426
Some text and numbers here, describing the experimental setup, eg  
Scan 3763 @ 81.95, contains 1000 points:

两列中的数字用 8 个空格隔开。但是,有时实验会出错,机器会产生这样的数据文件:

mass      intensity

Some text and numbers here, describing the experimental setup, eg  
Scan 3763 @ 81.95, contains 1000 points:

我发现使用带有单个标题行的空格分隔文件,即

importdata(path_to_file,' ',  1);

最适合普通文件。但是,它在所有异常文件上都完全失败。解决这个问题的最简单方法是什么?我应该坚持使用 importdata(已经尝试了所有可能的设置,但它不起作用)还是应该尝试编写自己的解析器?理想情况下,我想在 Nx2 矩阵中为正常文件获取这些值,为异常文件获取 [0 0]。

谢谢。

【问题讨论】:

    标签: matlab file-io data-import


    【解决方案1】:

    我认为您不需要创建自己的解析器,这也不是那么不正常。在这里使用 textscan 是您的最佳选择。

    fid = fopen('input.txt', 'rt');
    data = textscan(fid, '%f %u', 'Headerlines', 1);
    fclose(fid);
    
    mass = data{1};
    intensity = data{2};
    

    产量:

    mass =
      350.8578
      350.8925
      350.9869
      351.8790
      352.1771
      352.2845
    
    intensity =
             238
            3094
            2762
             468
             569
             426
    

    对于您的第一个文件和:

        mass =
           Empty matrix: 0-by-1
    
        intensity =
           Empty matrix: 0-by-1
    

    为你的空的。

    默认情况下,文本扫描读取空白作为分隔符,它只会读取您告诉它的内容,直到它不能再这样做;因此它会忽略文件中的最后几行。如果您想获取这些附加字段,还可以在此之后运行第二个 textscan:

    fid = fopen('input.txt', 'rt');
    data = textscan(fid, '%f %u', 'Headerlines', 1);
    
    mass = data{1};
    intensity = data{2};
    
    data = textscan(fid, '%*s %u %*c %f %*c %*s %u %*s', 'Headerlines', 1);
    
    scan = data{1};
    level = data{2};
    points = data{3};
    
    fclose(fid);
    

    连同您的质量和强度数据一起给出:

        scan =
                3763
    
        level =
           81.9500
    
        points =
                1000
    

    【讨论】:

      【解决方案2】:

      你是什么意思'在异常文件上完全失败'?

      您可以使用例如检查 importdata 是否找到任何数据

      >> imported = importdata(path_to_file,' ',  1);
      >> isfield(imported, 'data')
      

      【讨论】:

      • 对不起,我应该更准确。 “完全失败”意味着它导入了“@”之后的数字,在上面的示例中为 81.95。这不是完全失败,但不是我需要的。
      • 奇怪,我的只是空的。你能发布一个“异常”文件的例子吗? (+您使用的 matlab 版本)
      猜你喜欢
      • 1970-01-01
      • 2011-11-19
      • 2023-03-25
      • 2017-01-30
      • 2013-11-19
      • 2017-03-24
      • 2019-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多