在矩阵中读取标题和时间

时间:2013-12-09 12:10:02

标签: matlab octave text-parsing

我正在尝试将.txt文件中的文件读入矩阵。我的问题是标题和时间。我使用fgetl函数读取标题,并使用dlmread函数跳过顶行。我的文本文件的格式是:

time;col1;col2;col3;col4;col5;...
13:27:15.3167892;6.546785;5.456778;4.5561345435;....
................................

我尝试使用importdatadatenum,但问题在于小数位。我该如何解决这个问题?

我希望输出像这样

Time               col1        col2       col3         
13:27:15.3167892   6.546785    5.456778   4.5561345435 

这是我正在使用的代码,但它无法读取时间戳。

A = importdata(filename, ';', 1);
tm = datenum(A.textdata(2:end,1), 'HH:MM:SS');
data = A.data;

1 个答案:

答案 0 :(得分:0)

如果事先不知道列数,您可以先解析标题行:

fid = fopen('input.txt');
cols = numel(regexp(fgetl(fid), ';', 'split'));

至于解析数据,最好在这里使用textscan,利用列数来构造正确的格式字符串。此外,最好将时间戳保持为字符串而不是数值:

fmt = ['%s ', repmat('%f', 1, cols - 1)];
C = textscan(fid, fmt, 'Delimiter', ';', 'CollectOutput', true);
T = vertcat(C{1}{:});  %// Extract timestamps
A = C{2};              %// Extract data values

当然,不要忘记关闭输入文件:

fclose(fid);

这将为您留下存储在字符串数组中的时间戳( char矩阵)T,并重置矩阵{{1}中的值数据}。

我不确定您要对时间戳做什么,但您可以根据需要操纵A例如

T

<强> P.S。
如果要忽略小数点后的数字,可以改为使用以下格式字符串:

vals = datenum(T)

或者,如果你想只保留小数点后面的第一个(最重要的)三位数,你可以使用它:

fmt = ['%[^.].%*s ', repmat('%f', 1, cols - 1)];

<强>八度
Octave的fmt = ['%12s%*s ', repmat('%f', 1, cols - 1)]; 无法识别regexp选项,也不支持'tokens',因此这里有另一种选择:

'CollectOutput'