我正在尝试为我的应用程序编写一个健壮的读命令。我希望读取代码能够处理* .txt是否具有标题(标题)行。
用户将创建一个始终为7列宽且未知长度的轨迹文件。第一行可以是列的标题行,也可以不是。通常我在excel中创建我的文件,然后使用“Unicode Text”格式保存它们。我知道我可以使用xlsread()但我更喜欢从文本文件中读取多功能性。这是我目前的代码:
In_fID=fopen([Dir,File],'r');
FirstLine=fgetl(In_fID);
model_data=textscan(In_fID,'%f %f %f %f %f %f %f');
if ischar(FirstLine)
model_data=cell2mat(model_data);
else
FirstLine=cell2mat(FirstLine);
model_data=cel2mat(model_data);
model_data=[FirstLine;model_data];
end
无论第一行是“时间xyzrp yw”的标题行还是我的轨迹的第一个坐标(例如:“0 0 0 0 0 0 0”),ischar(Firstline)
总是返回true(1 )。有谁知道我怎么解决这个问题?
答案 0 :(得分:2)
只要您未达到EOF,fgetl
的结果为char
是正常的。在MATLAB命令窗口中输入doc fgetl
以获取帮助;你会看到返回的值是文本字符串或-1。
现在,提出问题的方式并非100%清楚预期的行为是什么......但我的猜测是:您想知道第一条扫描线是否是标题。一个好的测试是检查sscanf(FirstLine, '%f')
返回的转换数字字段的数量; if小于每行的预期计数,是一个很大的机会,它是一个标题(它也可能是一个格式错误的行):
N_FIELDS_PER_LINE = 7;
%// . . .
if numel(sscanf(FirstLine, '%f')) ~= N_FIELDS_PER_LINE
%// Line-Is-Header case
else
%// Line-Is-Data case
end;
答案 1 :(得分:0)
ischar
不是您尝试进行支票的最佳选择。
您可以检查第一个值:
In_fID = fopen( [Dir,File] , 'r' ) ;
FirstValue = fscanf(In_fID,'%f',1) ; %// this will return empty if the first text does not represent a number
if isempty( FirstValue )
Headers = textscan( In_fID , '%s %s %s %s %s %s %s' , 1 ) ; %// read the header titles
else
fseek( In_fID , 0 , 'bof' ) ; %// Rewind the cursor to the beginning of the file
end
model_data=textscan(In_fID,'%f %f %f %f %f %f %f'); %// read your data normally
fclose(In_fID) ; %// don't forget to close your file ;)
这会尝试从文件中读取数值
如果失败(例如,如果文件中的第一个文本无法转换为数字),则会读取一行文本标题标题(并将光标移动到下一行)。
如果第一个读数返回实际值,程序倒带(替换文件开头的光标)
最后一行将文件的其余部分读作数值。