2

我正在尝试解释来自眼动追踪设备的数据。从眼动仪导出的文件为 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 ...

请注意,上面每一行末尾的点输出文件的一部分,即我没有出于这个问题的目的添加它们。我通常会检测到这些点,然后将它们扔掉。

上述各列的格式为[timestamp, X, Y, actuatorSize, {...}]

双眼的记录如下所示(仅显示四行):

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 .....

在这种情况下,数据格式为[timestamp, X(left), Y(left), actuatorSize(left), X(right), Y(right), actuatorSize(right), {.....}]

在这两种情况下,我都想从文本中提取数字并将它们分配给一个数组。以下是我如何从单眼记录中执行此操作:

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

我可以使用以下代码对双目记录执行相同的操作:

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

问题是,我希望能够自动检测我正在处理的数据是单目还是双目。换句话说,我需要一种方法来确定 ASCII 文件是有五列还是八列。请注意,两种情况下的最后一列仅由一系列点组成。虽然我通常只是把它扔掉,但它可能对确定记录中的眼睛数量很有用(因为单目记录每行以 结束...,双目以结束.....

欢迎任何关于我如何计算每个 ASCII 文件中有多少列的想法!

4

2 回答 2

3

您可以读取第一行数据,检查列数,然后恢复文件位置指示器 例如:

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

于 2013-10-23T13:39:17.133 回答
1

您可以使用 shell 命令计算文件中的列数,您可以使用 MATLAB 调用该命令

s = system(shell_command);

要生成适合您需要的“shell_command”,请查看以下链接

unix - 文件中的列数

于 2013-10-23T13:38:17.253 回答