【问题标题】:Using getline and istringstream to read data from CSV file使用 getline 和 istringstream 从 CSV 文件中读取数据
【发布时间】:2015-05-20 14:35:48
【问题描述】:

我正在尝试读取包含以下条目的 CSV 文件:

//2009-12-31 21:00:00, COUNTRY ,1.84296,350.947,60.72

这就是我所做的

#include <iostream>
#include <fstream>
#include <sstream>

int main()
{
    using namespace std;
    ifstream read("data.csv");

    string line;

    //I want to use this to hold the data temporarily
    string temp[5];

    while (std::getline(read, line))
    {
        int i=0;
        std::istringstream iss(line); // string stream
        while(std::getline(iss, temp[i], ','))
        {
            cout << i << ": " << temp[i] << endl;
            ++i;
        };
    }
}

但它没有做我希望代码做的事情。特别是,代码在我达到 21 的整数后停止。这是输出

0: 2009-12-31 21:00:00
1: GRID_A
2: 1.84296
3: 350.947
4: 60.72
2010-01-01 00:00:00
5: GRID_A
6: 1.93569
7: 348.98
8: 60.64
2010-01-01 03:00:00
9: GRID_A
10: 2.30688
11: 339.444
12: 247.6
2010-01-01 06:00:00
13: GRID_A
14: 1.74453
15: 326.219
16: 587.92
2010-01-01 09:00:00
17: GRID_A
18: 2.16002
19: 289.19
20: 180.72
2010-01-01 12:00:00
21: GRID_A

然后我收到这样的错误

_LIBCPP_INLINE_VISIBILITY
    static void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
        {__c1 = __c2;}
Thread 1: EXC_BAD_ACCESS...

你能告诉我有什么问题吗?非常感谢!

PS:原来问题与我在 Mac 上使用 Excel 保存的 CSV 文件有关。缺少换行符。

【问题讨论】:

  • 我会使用正则表达式。
  • 如果你不能提供有问题的例子和预期的输出,不要指望太多帮助。与实际错误相比,找到可能的错误要困难得多。
  • 看看第 22 行。你的问题可能就在那里。

标签: c++ ifstream getline


【解决方案1】:

如果每行只有 5 列,您的代码就可以工作。如果i 大于 4,您将遇到问题。正如你所说,你的i 是 21 岁!你的数组不能接受这么多元素。如果i 超出您的数组范围,您应该将循环留在最后。

您尝试访问彩虹之外某处的temp[21]。难怪你会得到 BAD ACCESS。

只需将temp 用作单个字符串。如果您只想输出值,则不需要数组。只需使用string temp; 并在下面删除[i]

【讨论】:

  • 谢谢,我想做的是使用 temp[5] 来保存每行中的五个元素。我没想到整数 i 会超过 4。
  • 如果您的 csv 文件包含一行带有更多逗号的行,则会发生这种情况。
  • 我的 CSV 文件中的行如下所示:2009-12-31 21:00:00,GRID_A,1.84296,350.947,60.72
  • 也许您的std::getline(read, line) 提取了一行?您可以通过在int i ... 之前输出line 来测试吗?也许您的 CSV 文件的行尾与 std::getline 的默认行分隔符不兼容。
  • 谢谢!但是,如果我删除 [i],我会将整行读入 temp,这不是我想要的。出于实际原因,我需要将每个属性放入 temp[i] for i=0,1,2,...,4 中。您能告诉我如何实现这一目标吗?
猜你喜欢
  • 1970-01-01
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-13
  • 2015-01-21
  • 1970-01-01
  • 2014-12-11
  • 2013-02-28
相关资源
最近更新 更多