我正在接收包含字符串并将某个范围内的所有内容转换为double类型的.csv文件。我的目标实际上只是捕获第4列,但将其全部作为矩阵似乎是最好的方法,以防我想要捕获更多。但是,当我从字符串转换为double类型时,转换对我来说没有意义。
一个字符串,表示" 24个月"将被转换为值24.但是,一个字符串表示" 4.35183217"将被转换为0(实际上它是一个非常小的负数)。这是为什么?
see input here see output here
[<div class="content-block">\n</div>, <a class="button active">This is a new button!</a>]
答案 0 :(得分:3)
您的数据未初始化且未定义,这就是为什么它默认为一些小数字。您可以按如下方式进行初始化:double data[38][27]={0};
或更好地使用std::vector
其次,您的* .csv文件是这样的:
"abc", "123", "345"
有一个额外的空格或引号。字符串表示为"\"345\""
,未转换为345.00
。
使用stringstream
代替std::stod
,当输入无法转换时,会引发异常。例如:
try
{
double temp = std::stod(val);
}
catch (...)
{
std::cout << "bad input: " << val << std::endl;
}
使用以下功能从文本的左/右删除引号和空格:
void trim(std::string& s, const char* t)
{
s.erase(0, s.find_first_not_of(t));
s.erase(s.find_last_not_of(t) + 1);
}
把它放在一起:
std::vector<std::vector<double>> data;
std::string line;
while(std::getline(file, line))
{
std::vector<double> row;
std::stringstream iss(line);
std::string val;
while (std::getline(iss, val, ','))
{
trim(val, " \"");
try
{
double temp = std::stod(val);
row.push_back(temp);
}
catch (...)
{
std::cout << "bad input: " << val << std::endl;
}
}
std::cout << "\n";
data.push_back(row);
}
for (const auto &row : data)
{
for (const auto &col : row)
std::cout << col << ", ";
std::cout << "\n";
//if (data[i].size() > 4) std::cout << data[i][4] << "\n";
}