当遇到数字列中的非数字值时,如何使textscan写入NaN?

时间:2018-12-23 18:02:14

标签: matlab

我有一个带有多个列的csv,第二列是唯一一个带有字符串的列,因为它为变量命名。我用fopen打开csv,并希望使用textscan将其内容存储在单元格中。但是,在数字列中有许多非数字值(错误),其中都带有逗号。我希望textscan在他们的位置写NaN而不是停下来。这就是我所拥有的:

fileID = fopen(input,'r');
cell = textscan(fileID, '%n %s %n %n %n %n %n %n %n','Delimiter',',','HeaderLines',1,'ReturnOnError',false, 'EmptyValue',NaN, 'TreatAsEmpty','*,*');
fclose(fileID);

非常欢迎任何帮助。

1 个答案:

答案 0 :(得分:0)

假设您的数据如下所示:

col1,col2,col3,col4,col5,col6,col7,col8,col9
1,n1,1,1,fgd,1,1,1,1
2,n2,2,2,2,2,dfdf,2,2
3,n3,3,3,3,3,3,str1,223,,3

,您别无选择更改数据

  • 将分隔符从逗号更改为分号
  • 或用双引号将数据引起来

textscan()不够聪明,无法检测到。 我建议一种类似的方法:

fid = fopen('c.csv');
data = char(fread(fid))';
fclose(fid);
data = split(data);

现在您可以逐行(逐个单元)解析数据。

{'col1,col2,col3,col4,col5,col6,col7,col8,col9'}
{'1,n1,1,1,fgd,1,1,1,1'                        }
{'2,n2,2,2,2,2,dfdf,2,2'                       }
{'3,n3,3,3,3,3,3,str1,223,,3'                  }

fmt = '%s %s %s %s %s %s %s %s %s';
data = textscan(fid, fmt, ...

在解析循环中的某个地方,您可以使用str2double,如果它不是数字,将导致NaN

>> str2double('str')

ans =

NaN