2010-08-09 108 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