[英]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.