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

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

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

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 (слева), размер зрачка (слева), X (справа), Y (справа), размер зрачка (справа), {.....}]

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

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

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

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

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

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


person CaptainProg    schedule 23.10.2013    source источник


Ответы (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 в строке шаблона.

person Eitan T    schedule 23.10.2013
comment
Есть ли особая причина использовать ftell и fseek, а не только frewind? - person marsei; 24.10.2013
comment
@Magla Вы не можете быть уверены, что исходная позиция была началом файла (например, есть строки заголовка, предшествующие данным). - person Eitan T; 24.10.2013

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

s = system(shell_command);

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

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

person rodms    schedule 23.10.2013