Matlab: как обрабатывать аномальные файлы данных - PullRequest
0 голосов
/ 31 августа 2010

Я пытаюсь импортировать большое количество файлов в 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 ]

4 голосов
/ 01 сентября 2010

Я не думаю, что вам нужно создавать свой собственный анализатор, и при этом это не так уж ненормально.Использование текстов может быть вашим лучшим вариантом здесь.

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

Для вашего 1-го файла и:

    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 голос
/ 31 августа 2010

что вы подразумеваете под 'полностью сбоем ненормальных файлов'?

вы можете проверить, находит ли importdata какие-либо данные, например,

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