我正在将时间序列数据的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的读取。有没有简单的方法或避免 这个预处理?
谢谢!
我正在将时间序列数据的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的读取。有没有简单的方法或避免 这个预处理?
谢谢!
正如David已经提到的那样,您根本不需要预处理该文件。 strtof()和strtod()都能够将NaN字符串转换为NaN float/double值。
如果您想用数据集中的0.0替换值,可以使用isnan()函数来完成。
if (isnan(val))
{
val = 0.0;
}
在我的机器上(VC++)函数调用:strtod(“NaN”,NULL)返回0.0(我认为没有有效的转换可以执行),而不是双NaN。我是否正确使用它? – Wawel100 2010-08-09 16:39:50
您正确使用它并且IBM编译器返回NaN。我只用MS VC++编译器尝试过,实际上它返回0.0。所以可能你应该使用stricmp()来测试你自己。 NaN的定义在std :: numeric_limits
谢谢!我现在使用strcmp()来测试“NaN”字符串,如果是,则调用std :: numeric_limits
你想让结果成为浮点数(或双精度数)NaN - 然后使用stdlib strtod()函数。
如果你想以自己的方式处理它(将其设置为0等),然后将每行读入一个字符串,用strcmp()检查NaN,然后根据你找到的字符串解析字符串 - 如果更容易NaN只能出现在一列中。
理想情况下,我想结果是一个双NaN。我现在来看看strtod()函数。 – Wawel100 2010-08-09 15:29:21
在创建文件时将NaNs转换为“0.0”?例如'printf(“%f”,isnan(val)?0.0:val);'? – 2010-08-09 15:19:40
你可以使用strtof()和strtod()分析NaN ---它们的字符串“NaN”(忽略大小写)被正确处理。 – 2010-08-09 15:23:06
NaN与0.0不一样! – 2010-08-09 15:44:16