为什么Matlab textscan函数无法读取+ 22.24作为浮点数?

时间:2018-09-13 06:10:01

标签: matlab textscan

我目前在matlab函数textscan上遇到问题。 我有一个看起来像这样的数据文件:

     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'时,textscan仅读取第一行,除了日期/时间字符串之外,其他所有内容均为空。我也尝试使用不带TreatAsEmpty和/或EmptyValue的textscan,但得到的结果相同。 我真的不明白为什么textscan有问题阅读例如,+ 22.24作为浮点数。 当我指定formatSpec以字符串形式读取所有数据时,它可以工作,但是之后我必须使用str2num,我真的不想这样做。

我非常感谢您的帮助,并希望了解这种行为。

1 个答案:

答案 0 :(得分:1)

简短答案:Matlab不喜欢这些字段中+和数字之间的空格。我认为最简单的解决方案可能是通过将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 );

最后,如果您陷入绝对必须阅读为文本然后转换为数值的地方,请尝试使用str2doubleq(可在Matlab文件交换上找到)。它比str2double或str2num快得多。