检测柱状文本文件中的列数

时间:2013-10-23 13:27:23

标签: matlab textscan

我正在尝试解释眼动追踪设备的数据。从眼动仪导出的文件是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,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(左),瞳孔尺寸(左),X(右),Y(右),瞳孔尺寸(右),{..... }]

在这两种情况下,我都想从文本中提取数字并将它们分配给数组。以下是我如何通过单眼进行录音:

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

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

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

麻烦的是,我希望能够自动检测我正在处理的数据是单眼还是双眼。换句话说,我需要一种方法来确定ASCII文件是有五列还是八列。请注意,两种情况下的最后一列只包含一系列点。虽然我通常只是抛弃它,但它可能有助于确定录音中的眼睛数量(因为单眼录音以...结束每一行,而.....双眼结束

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

2 个答案:

答案 0 :(得分: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来丢弃这些点。

答案 1 :(得分:1)

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

从MATLAB调用它

s = system(shell_command);

要生成符合您需求的'shell_command',请查看以下链接

unix - count of columns in file