使用.csv read将数组类型字符串转换为double

时间:2016-08-30 23:09:02

标签: c++ arrays csv

我正在接收包含字符串并将某个范围内的所有内容转换为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>]

1 个答案:

答案 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";
}