【问题标题】:Detect number of columns in a columnar text file检测柱状文本文件中的列数
【发布时间】:2013-10-23 13:27:22
【问题描述】:

我正在尝试解读来自眼动追踪设备的数据。眼动仪导出的文件为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,瞳孔大小,{...}]

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

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),punctureSize(left),X(right),Y(right),particleSize(right),{..... }]

在这两种情况下,我都想从文本中提取数字并将它们分配给一个数组。以下是我对单眼记录的处理方式:

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

我可以对双目记录做同样的事情,使用以下代码:

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

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

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

【问题讨论】:

    标签: matlab textscan


    【解决方案1】:

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

    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

    【讨论】:

    • 使用 ftell 和 fseek 而不是单独使用 frewind 有什么特别的原因吗?
    • @Magla 您无法确定原始位置是文件的开头(例如数据前面有标题行)。
    【解决方案2】:

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

    s = system(shell_command);

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

    unix - count of columns in file

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-13
      相关资源
      最近更新 更多