2017-07-30 44 views
-3

我有一個包含數十億行的巨大文件。每行有以下格式:對特定格式字符串進行高效分割

A B C D 

我只需要B和C的字符串不是字符的值。

我目前的分裂策略如下:

std::stringstream ss; 
std::string line, temp, bValue, cValue; 

while (std::getline(infile, line)) { 

    ss.clear(); 
    ss.str(out_str); 

    std::getline(ss, temp, '\t'); // Skip value of A 
    std::getline(ss, bValue, '\t'); // Set value of B 
    std::getline(ss, cValue, '\t'); // Set value of C 

    // Use values... 
} 

由於輸入文件中包含幾十行的,即使是微小的改進會對我的程序一般性能的影響。

任何想法或庫來提高性能?你有沒有遇到同樣的瓶頸並修復它?

謝謝。

+0

閱讀在索引2和4,獲得字符整條生產線,沖洗和重複。 –

+0

讀取所有四個值,丟棄第一個和最後一個? –

+0

Billions?這很多 –

回答

0

如果唯一的空格是分隔數據的空格,這是一個簡單的方法。它看起來像你在代碼中使用製表符分隔,所以我也會使用它,但它可以很容易地互換其他的東西。

std::string line; 
std::string a, b; 

while (std::getline(infile, line)) { 
    std::stringstream ss(line); 

    ss.ignore(std::numeric_limits<std::streamsize>::max(), '\t'); 

    ss >> a >> b; 
} 

這樣做是忽略輸入直到達到第一'\t',然後把字符串到ab字符串。另取如下,這是 並不整齊,但只是轉儲不必要價值爲a,後來其覆蓋:

std::string line; 
std::string a, b; 

while (std::getline(infile, line)) { 
    std::stringstream ss(line); 
    ss >> a >> a >> b; 
} 
+0

對第一個和第二個值使用相同的目標變量會引起混淆。使用第三個(臨時)字符串作爲第一個值,您根本不使用(對此有一些評論,並且第四個值被忽略)是IMO的首選。 –

+0

@Someprogrammerdude這就是爲什麼我寫道它不夠整潔,但如果沒有別的,它是一個快速的解決方案。這就是我提供第一個的原因。 – N00byEdge