0

我正在尝试将大量文件导入 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] 矩阵中获取这些值。

谢谢。

4

2 回答 2

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

给你空的。

默认情况下,文本扫描读取空白作为分隔符,它只会读取您告诉它的内容,直到它不再这样做;因此它会忽略文件中的最后几行。如果您想获取这些附加字段,您还可以在此之后运行第二个 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
于 2010-08-31T23:48:27.487 回答
1

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

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

>> imported = importdata(path_to_file,' ',  1);
>> isfield(imported, 'data')
于 2010-08-31T11:57:26.460 回答