2010-08-09 65 views
3

我正在将时间序列数据的csv文件读入C++程序。然而我的数据包含 一些NaN的。例如:如何在C++中读取csv文件时处理NaN

1-Jul-2010, 1.0 
2-Jul-2010, 2.0 
3-Jul-2010, NaN 
4-Jul-2010, 3.0 

为了解决这个问题,我写在Matlab短的脚本,替换所有NaN的0.0 - 我然后在新文件中没有NaN的读取。有没有简单的方法或避免 这个预处理?

谢谢!

+0

在创建文件时将NaNs转换为“0.0”?例如'printf(“%f”,isnan(val)?0.0:val);'? – 2010-08-09 15:19:40

+2

你可以使用strtof()和strtod()分析NaN ---它们的字符串“NaN”(忽略大小写)被正确处理。 – 2010-08-09 15:23:06

+3

NaN与0.0不一样! – 2010-08-09 15:44:16

回答

6

正如David已经提到的那样,您根本不需要预处理该文件。 strtof()和strtod()都能够将NaN字符串转换为NaN float/double值。

如果您想用数据集中的0.0替换值,可以使用isnan()函数来完成。

if (isnan(val)) 
{ 
    val = 0.0; 
} 
+0

在我的机器上(VC++)函数调用:strtod(“NaN”,NULL)返回0.0(我认为没有有效的转换可以执行),而不是双NaN。我是否正确使用它? – Wawel100 2010-08-09 16:39:50

+1

您正确使用它并且IBM编译器返回NaN。我只用MS VC++编译器尝试过,实际上它返回0.0。所以可能你应该使用stricmp()来测试你自己。 NaN的定义在std :: numeric_limits :: quiet_NaN(); – msteiger 2010-08-10 08:41:12

+0

谢谢!我现在使用strcmp()来测试“NaN”字符串,如果是,则调用std :: numeric_limits :: quiet_NaN()。但是有没有类似strtod的函数可以在MS VC++中正常工作? – Wawel100 2010-08-10 13:06:30

0

你想让结果成为浮点数(或双精度数)NaN - 然后使用stdlib strtod()函数。

如果你想以自己的方式处理它(将其设置为0等),然后将每行读入一个字符串,用strcmp()检查NaN,然后​​根据你找到的字符串解析字符串 - 如果更容易NaN只能出现在一列中。

+0

理想情况下,我想结果是一个双NaN。我现在来看看strtod()函数。 – Wawel100 2010-08-09 15:29:21