我正在尝试将.txt文件中的文件读入矩阵。我的问题是标题和时间。我使用fgetl
函数读取标题,并使用dlmread
函数跳过顶行。我的文本文件的格式是:
time;col1;col2;col3;col4;col5;...
13:27:15.3167892;6.546785;5.456778;4.5561345435;....
................................
我尝试使用importdata
和datenum
,但问题在于小数位。我该如何解决这个问题?
我希望输出像这样
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;
答案 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'