2017-07-30 49 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