【问题标题】:Abstracting Specific csv Column Information in C++在 C++ 中抽象特定的 csv 列信息
【发布时间】:2016-08-30 18:10:16
【问题描述】:

我正在从 .csv 文件中提取数据。我只想要来自 E 列的数据,但这取决于通过 A 列指定的内容。

也就是说,鉴于 A 列显示“USD Libor/Swap”,我想提取双精度(类型)值。

到目前为止,它只输出每一行。我附上了一张 Excel .csv 文件的图片供您参考。click here for image

你怎么能做到这一点?谢谢

字符串线;

ifstream ycratel; //create the stream object

ycratel.open("YC Rate Levels.csv");

if (ycratel.is_open())
{
    while (getline(ycratel,line))
    {
        getline(ycratel, line);
        cout << line << endl;
    }

    ycratel.close();
}

else cout << "Unable to open file.";

【问题讨论】:

  • 使用std::istringstream解析行。
  • 使用this 然后剩下的就简单了。
  • 我知道 istringstream 根据空格分隔字符串,但我不知道如何在给定这个 csv 的情况下实现该特定功能。

标签: c++ csv abstraction


【解决方案1】:

std::getline 函数在这些情况下非常有用:

std::string field_text;
std::getline(ycratel, field_text, ','); // Read until ','

结合if 声明:

if (field_text == "USD Libor/Swap")
{

跳过 4 列

std::getline(ycratel, field_text, ','); // field 2
std::getline(ycratel, field_text, ','); // field 3
std::getline(ycratel, field_text, ','); // field 4

阅读第五栏

std::getline(ycratel, field_text);
}

字段文本的评估留作 OP 的练习。

注意:由于只有 5 个字段,for 循环可能比展开循环更复杂。

此答案假定文件为 CSV - 逗号分隔值。 std::getline的分隔符字段可以调整为其他分隔符。

【讨论】:

  • 谢谢,这是好东西。不过,我不确定您如何“跳过”那里的列。即使使用 IF 语句,它仍然会打印出所有内容。
  • while (getline(ycratel,line)) { if (line == "USD LIBOR/Swap") { getline(ycratel, line, ','); // 字段 2 getline(ycratel, line, ','); // 字段 3 getline(ycratel, line, ','); // 字段 4 getline(ycratel, line); } cout
  • 鉴于这是 csv 文件,它读取“1,2,abc, zyx, 3, 5”,作为一个大字符串。从某种意义上说,它确实有效,因为它是一个子集。
  • 您是否尝试过使用std::getline 的*delimiter 形式?尝试编写一个小程序,使用std::getline 的定界符形式读取一行,使用5 个不同的字符串变量。打印出值变量。
  • 我能够弄清楚并正确分离和显示值。你的方法奏效了。我只是没有意识到 CSV 中的空格被认为是逗号,因此我很沮丧。我必须创建 17 个跳过的字段才能获得我想要的输出。但是,是的,现在我需要将第 5 列值转换为 double 并将它们放入向量中。此外,我还没有弄清楚如何让 IF 语句起作用。我将 IF 语句放在 getline(ycratel,f1,',') 之后并测试了 f1 = "USD LIBOR/Swap",然后像你说的那样跳过了其余的字段。但什么也没有出现。
猜你喜欢
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多