Matlab ischar没有识别数字

时间:2014-10-16 12:55:30

标签: matlab textscan

我正在尝试为我的应用程序编写一个健壮的读命令。我希望读取代码能够处理* .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 )。有谁知道我怎么解决这个问题?

2 个答案:

答案 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 ;)

这会尝试从文件中读取数值 如果失败(例如,如果文件中的第一个文本无法转换为数字),则会读取一行文本标题标题(并将光标移动到下一行)。
如果第一个读数返回实际值,程序倒带(替换文件开头的光标) 最后一行将文件的其余部分读作数值。