【问题标题】:Reading in a .csv file c++读取 .csv 文件 c++
【发布时间】:2018-01-20 12:43:30
【问题描述】:

我正在尝试读取一个 .csv 文件,其中填充了我拥有的程序的字符串。我编写了下面的代码来尝试读取每个单独的字符串。

string read_from_f(istream &in) {

string a;
char fill = '0';

while (fill != ',') {
    in.get(fill);

    if (fill != ',') {
        a += fill;
    }
}   

return a; 
}

这最终不起作用,因为我的一些字符串中有逗号,并且结构如下。 “........”、“唐纳德、特朗普”、“.....”

当我在调试时查看本地人时,in.get() 不会从每个字符串中读取双引号。有没有一种方法可以让我从引号读取到引号,以免出现任何意外错误?

【问题讨论】:

  • 如果您确定每个数据值都是一个字符串,为什么不使用双引号而不是逗号作为分隔符才读取呢?然后你只需要忽略所有其他结果(这只是一个逗号),你就会拥有一切
  • 您需要编写或至少使用适当的 CSV 解析器 - 我在 bitbucket.org/neilb/csvparse/src 有一个 - 您不能仅使用 C++ 标准库工具来做到这一点。
  • 创建一个appointment with your rubber duck 来解释您提出的解析 CSV 文件的算法。在得到橡皮鸭的批准之前,不要尝试编写另一行代码。
  • 发帖前请先搜索。 StackOverflow 上已经有大量类似的帖子。尝试使用关键字“stackoverflow c++ 读取文件 csv”

标签: c++ csv


【解决方案1】:

正如 scohe001 所建议的,如果您的 csv 仅由字符串组成,每个字符串都用双引号括起来,一个简单的解决方案是使用双引号作为分隔符并考虑提供的每个第二个值。使用getline 可以轻松读取直到分隔符:

#include <iostream>

int main()
{
    ifstream f(DATAFILE);
    if (!f.is_open()) {
        cout << "error opening file." << endl;
        return 1;
    }
    string content;
    int count = 0;
    while(std::getline(f, content, '"')) {
        if (count%2 != 0) { // every second entry is actual content
            cout << content << endl;
        }
        count++;
    }
    return 0;
}

【讨论】:

    【解决方案2】:

    所以我想出了一个简单的解决方案。我将 .csv 更改为 .txt 文件,而不是检查逗号,而是检查引号。当文件是 .txt 文件时,我的 in.get() 能够读取引号中的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-18
      • 1970-01-01
      • 2017-10-19
      • 2012-12-21
      • 2018-05-24
      • 2013-05-03
      • 1970-01-01
      相关资源
      最近更新 更多