Определить количество столбцов в столбцовом текстовом файле
Я пытаюсь интерпретировать данные с устройства слежения за глазами. Файлы, экспортируемые из трекера глаза, имеют формат 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', которая соответствует вашим потребностям, проверьте следующую ссылку