Определить количество столбцов в столбцовом текстовом файле

Я пытаюсь интерпретировать данные с устройства слежения за глазами. Файлы, экспортируемые из трекера глаза, имеют формат ASCII.

Файлы записи, которые содержат данные от одного глаза, выглядят только так (показано только четыре строки):

6372825   645.3   275.4  1362.0 ...
6372826   644.6   274.0  1364.0 ...
6372827   644.2   273.2  1365.0 ...
6372828   642.5   272.7  1367.0 ...

Обратите внимание, что точки в конце каждой строки выше являются частью выходного файла, т.е. я не добавил их для целей этого вопроса. Я обычно обнаруживаю эти точки, а потом выбрасываю их.

Формат вышеприведенных столбцов: [отметка времени, X, Y, pupilSize, {...}]

Запись с обоих глаз выглядит так (показано только четыре строки):

505076    416.8   755.4  1148.0    23.6   751.1  1239.0 .....
505077    417.0   758.4  1143.0    23.7   753.1  1244.0 .....
505078    416.7   761.4  1146.0    24.6   752.1  1249.0 .....
505079    416.1   764.8  1150.0    27.3   750.2  1250.0 .....

В этом случае формат данных: [отметка времени, X(слева), Y(слева), pupilSize(слева), X(справа), Y(справа), pupilSize(справа), {.....}]

В обоих случаях я хотел бы извлечь числа из текста и присвоить их массиву. Вот как я делаю это для записи с одного глаза:

eyeData = textscan(fid,'%d %f %f %f %s');

Я могу сделать то же самое для бинокулярных записей, используя следующий код:

eyeData = textscan(fid,'%d %f %f %f %f %f %f %s');

Проблема в том, что я хотел бы иметь возможность автоматически определять, являются ли данные, с которыми я имею дело, монокулярными или бинокулярными. Другими словами, мне нужен способ определить, имеет ли файл ASCII пять столбцов или восемь. Обратите внимание, что последний столбец в обоих случаях просто состоит из серии точек. Хотя обычно я просто выбрасываю это, это может быть полезно для определения количества глаз в записи (поскольку монокулярные записи заканчиваются в каждом ряду ... и бинокль с .....)

Любые идеи относительно того, как я могу определить, сколько столбцов в каждом файле ASCII, приветствуются!

2 ответа

Решение

Вы можете прочитать первую строку данных, проверить количество столбцов, а затем вернуть индикатор положения файла. Например:

pos = ftell(fid);
cols = numel(regexp(fgetl(fid), '\s*([^\s]*)\s*'));
fseek(fid, pos, 'bof');

Это может сопровождаться:

if (cols == 5)
    eyeData = textscan(fid, '%d %f %f %f %s');
else
    eyeData = textscan(fid, '%d %f %f %f %f %f %f %s');
end

Кстати, обратите внимание, что вы можете сказать textscan отбросить точки с помощью %*s вместо последнего %s в строке шаблона.

Вы можете сосчитать столбцы в файле с помощью команды оболочки, которую вы можете вызвать из MATLAB, используя

s = system(shell_command);

Чтобы создать 'shell_command', которая соответствует вашим потребностям, проверьте следующую ссылку

unix - количество столбцов в файле

Другие вопросы по тегам