我正在將時間序列數據的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