Matlab:如何处理异常数据文件

时间:2010-08-31 11:50:22

标签: matlab file-io data-import

我正在尝试将大量文件导入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]。

感谢。

2 个答案:

答案 0 :(得分:4)

我认为你不需要创建自己的解析器,这也不是那么异常。使用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

对于空的。

默认情况下,文本扫描将空格作为分隔符读取,它只读取您告诉它的内容,直到它不再这样做为止;因此它会忽略文件中的最后一行。如果您想要获取其他字段,也可以在此之后运行第二个文本扫描:

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

答案 1 :(得分:1)

你的意思是'异常文件完全失败'?

您可以使用例如

检查导入数据是否找到任何数据
>> imported = importdata(path_to_file,' ',  1);
>> isfield(imported, 'data')