从缺少列的文件中读取数据。 C++

Posted

技术标签:

【中文标题】从缺少列的文件中读取数据。 C++【英文标题】:Reading data from a file with missing columns. C++ 【发布时间】:2017-03-11 03:50:49 【问题描述】:

基本上我有一个包含 8 列的数据文件,我想将每列中的每个值放入一个数组变量中。但问题是缺少一些值。 例如

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++; 

【问题讨论】:

你听说过switch吗? 请同时指定文件格式,制表符和空格不要有歧义。 它确实有帮助,但我不完全了解如何使用它。 【参考方案1】:

在 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(postTab + 1, '/t') 查找每个字段的开头,从您可以保存在 posPreviousTab 中的上一个位置开始用作相等测试和第一个 substr 参数而不是零。

备注

对于大型数据集,在某些条件下,std::list 比 std::vector 快。您可以编写一个测试来比较您的案例的两个选项。

如果您正在处理大数据,您可能需要更高的速度,使用 char[MAXSIZE] 和 C 中的等效算法并动态处理,而不是将每条记录都存储在内存中。

【讨论】:

以上是关于从缺少列的文件中读取数据。 C++的主要内容,如果未能解决你的问题,请参考以下文章

C++文件读取中,怎样从文件中读取一种类型的数据

C++:从内存映射文件中读取/获取数据

在C++中如何读取文本中的数据存储为数组变量?

如何从 C++ 中的 hdf5 文件中读取数据块?

C++中怎么逐行读取数据

readr - 不读取缺少标题的列