如何允许文本文件中丢失数据

how to allow for missing data in a text file

本文关键字:数据 文件 何允许 文本      更新时间:2023-10-16

我有一个包含大量数据集的大文件,有一些空白,虽然标记为"——",无论出于何种原因,数据没有被记录。其余的数据将存储为双向量,我的问题是我如何捡起缺失的数据和存储这个缺失的数据为零?我的数据文件的一个片段;

0    29.1     ---
0    65.9     ---
2    56.5     ---
6    19.7    44.3
9    69.8    64.9
11   118.6   64.8
7    35.7    64.1


if (myfile.is_open())
  {
    int count = 0;
    while ( myfile.good() )
    {
      getline (myfile,line);
      /*if (line == "---")
        {
        sun(0.0);
        }*/
      if (count > 6) 
      {
      std::istringstream buffer(line);
            int month;
            double  rain, sun;
            if (buffer >> month >> rain >> sun)
            {
                Weather objName = {month, rain, sun};
                data_weather.push_back(objName);       
            }
      }
      count++;
    }
    myfile.close();

将数据作为字符串一次一行读取。检查是否为"——"。如果是,则保持0.0,如果不是,则转换为双精度类型并保存。

string line;
while (getline(file, line))
{
    if (line == "--")
    {
        save(0.0);
    }
    else
    {
        istringstrleam buf(line);
        double value;
        if (buf >> value)
        {
            save(value);
        }
        else
        {
            error("could not convert value");
        }
    }
}

我使用istringstream来完成从string到double的转换。

根据问题中关于文件格式的新信息,下面的代码应该可以工作(但它是未经测试的代码)。

string line;
while (getline(file, line))
{
    if (count > 6)
    {
        int month;
        double rain, sun;
        std::string sun_as_string;
        std::istringstream buffer(line);
        if (buffer >> month >> rain >> sun_as_string)
        {
            if (sun_as_string == "--")
            {
                sun = 0.0;
            }
            else
            {
                std::istringstream buffer2(sun_as_string);
                if (!(buffer2 >> sun))
                {
                    // couldn't convert the sun value, so just set to zero
                    sun = 0.0;
                }
            }
            Weather objName = {month, rain, sun};
            data_weather.push_back(objName);       
        }
    }
    ++count;
}

基本思想和前面一样,读取sun值为字符串,只有当它不是"——"时才转换为双精度类型

我将给出一个稍微不同的替代方案,它不会显式检查行是否为--,它只会看到它不是有效的float

您可以简单地读取每一行一次与std::getline,这将只会停止,一旦你到达文件的末尾。您可以尝试从每行提取到已初始化为0float(或double)。如果提取失败,该值仍为0

std::string line;
while (std::getline(file, line)) {
  std::istringstream ss(line);
  float f = 0.0f;
  ss >> f;
  results.push_back(f);
}