簡體   English   中英

使用fstream從文件中讀取缺失值“ NA”

[英]reading missing values “NA” from file using fstream

我正在使用這些代碼從txt文件讀取數據,如果我的數據包含所有數字,則可以正常工作。 不幸的是,文件中當前缺少表示為“ NA”的值。 您能否提出任何解決此問題的方法/代碼,並且不會影響以后的計算。 謝謝

#include <iostream>
#include <fstream>
 #include <string>
#include <vector>


using namespace std;

struct Data {
    vector<double> cow_id;
    vector<double> age_obs;
    vector<double> dim_obs;
vector<double> my_obs;
vector<double> mcf_obs;
vector<double> mcp_obs;
vector<double> mcl_obs;
vector<double> bw_obs;
vector<double> bcs_obs;

void read_input (const string filepath)

{
   ifstream data_in (filepath.c_str());
    if (!data_in)
        {cout<<"Failed to open"<<endl;}
    else
        {
        double id,age, dim, my, mcf, mcp, mcl, bw, bcs;
        string dummy_line;
        getline(data_in, dummy_line);
        string line;
        while (data_in>>id>>age>>dim>>my>>mcf>>mcp>>mcl>>bw>>bcs)
            {
            cow_id.push_back(id);
            age_obs.push_back(age);
            dim_obs.push_back(dim);
            my_obs.push_back(my);
            mcf_obs.push_back(mcf);
            mcp_obs.push_back(mcp);
            mcl_obs.push_back(mcl);
            bw_obs.push_back(bw);
            bcs_obs.push_back(bcs);

            }
            data_in.close();
        }

        size_t size=age_obs.size();
       for (size_t i=0; i<size; i++)
       {
           cout<<cow_id[i]<<'\t'<<age_obs[i]<<'\t'<<dim_obs[i]<<'\t'<<my_obs[i]<<'\t'<<mcf_obs[i]<<'\t'<<mcp_obs[i]<<'\t'<<mcl_obs[i]<<'\t'<<bw_obs[i]<<'\t'<<bcs_obs[i]<<endl;
       }
}

};

int main()
{
Data input;
input.read_input("C:\\Data\\C++\\learncpp\\data.txt");

}

您需要使用字符串標記讀取文件。 如果令牌不等於“ NA”,則將其轉換為整數。

// Helper function to get a double from a token.
// If the string is "NA", decide what's an appropriate value to return.
double get_number(string const& str)
{
   if ( str == "NA" )
   {
      return 0.0; // Maybe?
   }
   else
   {
      return std::stod(str);
   }
}

void read_input (const string filepath)

{
   ifstream data_in (filepath.c_str());
   if (!data_in)
   {cout<<"Failed to open"<<endl;}
   else
   {
      // Read tokens as strings.
      string id, age, dim, my, mcf, mcp, mcl, bw, bcs;

      string dummy_line;
      getline(data_in, dummy_line);
      string line;

      while (data_in >> id >> age >> dim >> my >> mcf >> mcp >> mcl >> bw >> bcs)
      {
         // Get the number from the string and add to the vectors.
         cow_id.push_back(get_number(id));
         age_obs.push_back(get_number(age));
         dim_obs.push_back(get_number(dim));
         my_obs.push_back(get_number(my));
         mcf_obs.push_back(get_number(mcf));
         mcp_obs.push_back(get_number(mcp));
         mcl_obs.push_back(get_number(mcl));
         bw_obs.push_back(get_number(bw));
         bcs_obs.push_back(get_number(bcs));

      }
      data_in.close();
   }

   size_t size=age_obs.size();
   for (size_t i=0; i<size; i++)
   {
      cout<<cow_id[i]<<'\t'<<age_obs[i]<<'\t'<<dim_obs[i]<<'\t'<<my_obs[i]<<'\t'<<mcf_obs[i]<<'\t'<<mcp_obs[i]<<'\t'<<mcl_obs[i]<<'\t'<<bw_obs[i]<<'\t'<<bcs_obs[i]<<endl;
   }
}

用於OP的get_number實現。

double get_number(string const& str)
{
   if ( str == "NA" )
   {
      return 0.0; // Maybe?
   }
   else
   {
      std:istringstream iss(str);
      double val;
      iss >> val;
      return val;
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM