You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C++读取Excel CSV文件的double列并存入vector<double>变量?

问题分析与解决

错误原因

你的代码有两个核心问题导致无输出:

  1. 表头转换异常:CSV第一行是表头A,B,stod(val)尝试把字符串"A"转换成double时,会触发std::invalid_argument异常,默认情况下程序会直接终止,后续代码完全没机会执行,自然没有控制台输出。而你之前用string测试时只是存储字符串,不会触发转换异常,所以能正常运行。
  2. 读取逻辑不匹配CSV结构:Excel导出的CSV中,每行末尾的换行符会被以逗号为分隔符的getline忽略,导致后续读取可能混入换行符,同时你没有处理文件打开失败的情况(比如文件路径错误)。

修正方案

方案1:跳过表头+异常捕获+正确读取

先跳过表头行,再逐行读取A列数据,同时捕获转换异常,避免程序崩溃:

#include <iostream>
#include <fstream>
#include <vector>
#include <stdexcept>

using namespace std;

int main() {
    ifstream myFile("CData.csv");
    // 检查文件是否成功打开
    if (!myFile.is_open()) {
        cout << "无法打开文件" << endl;
        return 1;
    }

    string line;
    vector<double> y;

    // 跳过表头行
    getline(myFile, line);

    // 逐行读取数据
    while (getline(myFile, line)) {
        // 分割每行的第一个元素(逗号前的内容)
        size_t commaPos = line.find(',');
        if (commaPos == string::npos) continue; // 跳过无效行
        string val = line.substr(0, commaPos);
        try {
            double num = stod(val);
            y.push_back(num);
            cout << "test: " << num << endl;
        } catch (const invalid_argument& e) {
            cout << "转换失败:" << val << endl;
        } catch (const out_of_range& e) {
            cout << "数值超出范围:" << val << endl;
        }
    }

    myFile.close();
    return 0;
}

方案2:简化读取逻辑(针对固定列)

如果确认A列始终是每行的第一个字段,也可以直接用逗号分隔读取,但需要先跳过表头:

#include <iostream>
#include <fstream>
#include <vector>
#include <stdexcept>

using namespace std;

int main() {
    ifstream myFile("CData.csv");
    if (!myFile.is_open()) {
        cout << "无法打开文件" << endl;
        return 1;
    }

    string val;
    vector<double> y;

    // 跳过表头的两个字段(A和B)
    getline(myFile, val, ',');
    getline(myFile, val);

    // 读取A列数据
    while (getline(myFile, val, ',')) {
        try {
            double num = stod(val);
            y.push_back(num);
            cout << "test: " << num << endl;
        } catch (const exception& e) {
            cout << "处理失败:" << val << endl;
        }
        // 跳过当前行的B列内容
        getline(myFile, val);
    }

    myFile.close();
    return 0;
}

其他注意事项

  • 确保文件路径正确:如果程序和CSV不在同一目录,要使用绝对路径(比如"C:/xxx/CData.csv")。
  • Excel导出CSV时,注意编码格式(一般用UTF-8),避免读取到乱码导致转换失败。

内容的提问来源于stack exchange,提问作者chicken420

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 11:35:29