2017-03-11 28 views
1

基本上我有8列的数据文件,我想要把从每一列中的每个值到一个数组变量。但问题是有些值缺失。 例如从缺少列的文件中读取数据。 C++

100 54201.10 49392 9379101 10381.1372 
101 5823829  73929 83729.77 

缺失值由一个额外的选项卡或/ t空间隔开。 我怎样才能读取的值,忽略丢失的数据并输入正确的值到可一次正确的变量?

我试着使用:

infile >> network; 
    string val = isNaN(network); 
    if (count % 8 == 0) { ID[count/8] = val; } 
    if (count % 8 == 1) { time[count/8] = val; } 
    if (count % 8 == 2) { country_code[count/8] = val; } 
    if (count % 8 == 3) { sms_in[count/8] = val; } 
    if (count % 8 == 4) { sms_out[count/8] = val; } 
    if (count % 8 == 5) { call_in[count/8] = val; } 
    if (count % 8 == 6) { call_out[count/8] = val; } 
    if (count % 8 == 7) { internet[count/8] = val; } 
    count++; 
+0

你听说过'之开关? –

+0

也请指定文件的格式,不要在选项卡和空格上含糊不清。 –

+0

我的回答下面有帮助吗? –

回答

0

一个好办法做到这一点在C++中使用函数getline得到每一行。

#include <string> 
#include <vector> 
... 
typedef struct { 
    unsigned long id; 
    unsigned long timestamp; 
    ... 
} Record; 
std::vector<Record> records; 
while (std::getline(std::cin, s)) { 
    ... 

然后使用substr填写记录的集合。假设你的字段是制表符分隔的,并且数字保持正确,那么你可以像这样处理默认值。

posTab = s.find_first_of('\t'); 
records[i].id = posTab == 0 
    ? defaultID 
    : std::atoi(s.substr(0, posTab).c_str()); 

索引i是记录索引,从0开始浮动和双精度浮点数,你需要替换的std ::的atoi相应的标准数值解析器。

如果数据是制表符分隔,每个字段(每个记录)使用find_first_of(posTab + 1“/ T”)找到每个字段的开始,从以前的位置,也可以保存在首发posPreviousTab用作相等性测试,并使用第一个substr参数而不是零。

注意

对于大型数据集,并在某些情况下,标准::列表比的std ::向量更快。你可以编写一个测试来比较你的案例的两个选项。

如果你是在处理大数据时,可能需要更高的速度,使用的char [MAXSIZE]和C中的等价算法和程序在运行,而不是每个记录存储在内存中。