为什么matlab文本无法将函数读取+ 22.24作为浮点数?

问题描述 投票:1回答:1

我目前在使用matlab函数文本扫描时遇到问题。我有一个看起来像这样的数据文件:

     1,2018/08/14 17:06:15,  0,+ 22.24,+ 22.46,+ 18.18,+0.0000,+0.0005,LLLLLLLLLL,LLLLLLLLLL,LLLL

或者有时当传感器工作不正常时,它看起来像这样:

   1,2018/07/11 17:02:53,  0,+ 23.88,+ 24.78,+ 23.65,+++++++,+ 23.94,+ 23.01,+ 24.33,LLLLLLLLLL,LLLLLLLLLL,LLLL

由于数据因文件而异,我正在从标题行创建匹配的formatSpec。在第一种情况下,它看起来像

formatSpec = '%*u %s %*u%f%f%f%f%f%*[^\n]'

而在第二种情况下喜欢

formatSpec = '%*u %s %*u%f%f%f%f%f%f%f%*[^\n]'

我正在使用像这样的texscan函数:

textscan(fileID, formatSpec_data, data_rows, 'Delimiter', ',', 'TreatAsEmpty', {'+++++++'},'EmptyValue', NaN, 'ReturnOnError', 0 );

但它不断向我发出错误消息

Error using textscan
Mismatch between file and format character vector.
Trouble reading 'Numeric' field from file (row number 1, field number 4) ==> + 23.88,+ 24.78,+ 23.65,+++++++,+ 23.94,+ 23.01,+ 24.33,LLLLLLLLLL,LLLLLLLLLL,LLLL\n

Error in data_logger (line 31)
dataArray = textscan(fileID, formatSpec_data, data_rows, 'Delimiter', delimiter, 'HeaderLines' ,startRow, 'TreatAsEmpty', {'+++++++'},'EmptyValue', NaN, 'ReturnOnError', 0 );

当我停用'returnOnError'时,文本扫描只读取第一行,除日期/时间字符串外,一切都只是空的。我也尝试使用没有TreatAsEmpty和/或EmptyValue的textscan但我得到了相同的结果。我真的不明白为什么textcan有问题需要阅读,例如,+ 22.24作为浮动。当我指定formatSpec将所有数据作为字符串读取时它可以工作,但之后我必须使用str2num,我真的不想这样做。

我很感谢每一个帮助,并期待了解这种行为。

matlab textscan
1个回答
1
投票

简短回答:Matlab不喜欢+和这些字段中的数字之间的空格。我认为最简单的解决方案可能是告诉Matlab通过将其称为空白来忽略+。当你调用textscan时添加参数'WhiteSpace','+',如下所示:

textscan(fileID, formatSpec_data, data_rows, 'Delimiter', ',', 'EmptyValue', NaN, 'ReturnOnError', 0 , 'WhiteSpace', '+');

请注意,我还删除了'TreatAsEmpty'参数,因为一旦将所有+视为空白,它仍然是空的。

另一种选择是预先解析文件并删除+和数字之间的空格。您可以使用fileread读取文件,使用strrep或regexprep进行替换,然后对结果运行textscan。

datain = fileread('mydatafile.csv')
datain = strrep(datain,'+ ','+');
textscan(datain, formatSpec_data, data_rows, 'Delimiter', ',', 'TreatAsEmpty', {'+++++++'},'EmptyValue', NaN, 'ReturnOnError', 0 );

最后,如果您遇到绝对必须阅读的文本然后转换为数值,请尝试在Matlab文件交换中提供的str2doubleq。它比str2double或str2num快得多。

© www.soinside.com 2019 - 2024. All rights reserved.