【问题标题】:c++ reading csv filec++读取csv文件
【发布时间】:2013-11-12 17:56:44
【问题描述】:

我想用 c++ 读取 csv 文件 所以这是我的代码

 int main(){
 ifstream classFile("class.csv");
 vector<string> classData;

 while (getline(classFile, line,',')) // there is input overload classfile
        {
            classData.push_back(line);  

        }
}

这是我的问题:我的问题是当它读取每一行的最后一列时 (因为它没有用逗号分隔)它读取最后一列数据和下一行数据的第一个 例如,如果我的数据是这样的

类名、类位置、教授 c++, 图书馆, 约翰

然后它读起来像 className/classLocation/Professor c++/Library/John

无论如何,我可以将我的最后一列与下一行的第一列分开吗? 谢谢,很抱歉,这令人困惑

【问题讨论】:

标签: c++ csv


【解决方案1】:

逐行读取文件:

std::string line;
while(std::getline(stream, line)) ...

将每一行传递给 istingstream 并读取字段:

std::istringstream s(line);
std::string field;
while (getline(s, field,',')) ...

免责声明: 这是对 csv 文件的简化解析。

【讨论】:

  • 肯定在某种循环中。 while 循环是一个不错的选择,因为您不一定知道 .csv 文件会有多长时间,而终止条件只会超出行数。
  • 哇!!有用!!我完全不知道如何或为什么,但它有效! XD 谢谢!!
  • 我猜它应该是 istringstream s(line)?因为 istringstream(line) s 不起作用.. 但非常感谢!
【解决方案2】:

抱歉,我可以在这个线程中插入一些普通的 C 吗?

阅读 csv 很清楚:

#include <stdio.h>


int main()
{
  float f1, f2;

  FILE *fp;
  fp = fopen("file.csv", "r");

  while (fscanf(fp, "%g,%g\n", &f1, &f2) == 2)
    printf("%g\n", f1+f2);
}

当然,它应该在 C++ 工作的地方工作。

while 中,我们检查 fscanf 找到了多少对象:fscanf(fp, "%g,%g\n", &amp;f1, &amp;f2) == 2 -- fscanf 返回找到的对象数量。

我希望它可能对某人有所帮助。

(如果有人想查看fscanf 的更多信息并阅读文件——请留下一些 cmets。)

【讨论】:

  • 在对 CSV 格式进行最微不足道的更改(例如逗号后有一个空格或不同(非 unix)换行符)下,这不会中断吗?
  • 是的,它肯定会坏掉。而且,除了CSV文件中的空格问题外,程序中的字段数是固定的,而getline则不是这样。 (不过,通常 CSV 中的字段数是固定的。)
【解决方案3】:

如果您有兴趣在您的main 部分调用void 函数,请查看以下代码:

void readCSV(const string &strPath2Dataset)
{   
    ifstream csvFile;
    string strPathCSVFile = strPath2Dataset + "/test.csv";
    csvFile.open(strPathCSVFile.c_str());

    if (!csvFile.is_open())
    {
        cout << "Path Wrong!!!!" << endl;
        exit(EXIT_FAILURE);
    }

    vector<long double> timeStampIMU;
    vector<long double> gyro_X;
    vector<long double> gyro_Y;
    vector<long double> gyro_Z;

    vector<long double> acc_X;
    vector<long double> acc_Y;
    vector<long double> acc_Z;

    string line;
    vector <string> vec;
    getline(csvFile, line); // skip the 1st line

    while (getline(csvFile,line))
    {
        if (line.empty()) // skip empty lines:
        {
            //cout << "empty line!" << endl;
            continue;
        }

        istringstream iss(line);
        string lineStream;
        string::size_type sz;

        vector <long double> row;

        while (getline(iss, lineStream, ','))
        {  
            row.push_back(stold(lineStream,&sz)); // convert to double
        }

        timeStampIMU.push_back(row[0]);

        gyro_X.push_back(row[1]);
        gyro_Y.push_back(row[2]);
        gyro_Z.push_back(row[3]);

        acc_X.push_back(row[4]);
        acc_Y.push_back(row[5]);
        acc_Z.push_back(row[6]);
    }

    //cout << "size ts = " << timeStampIMU.size() << endl;
    for (size_t i = 0; i < timeStampIMU.size(); i++)
    {
        cout << "ts_imu = " << setprecision(12) << timeStampIMU[i] << endl;

        cout << "gx = " << setprecision(12) << gyro_X[i] << endl;
        cout << "gy = " << setprecision(12) << gyro_Y[i] << endl;
        cout << "gz = " << setprecision(12) << gyro_Z[i] << endl;

        cout << "ax = " << setprecision(12) << acc_X[i] << endl;
        cout << "ay = " << setprecision(12) << acc_Y[i] << endl;
        cout << "az = " << setprecision(12) << acc_Z[i] << endl;
        cout << "--------------------------------" << endl;
    }
}

我的.csv文件是IMU传感器提供的数据集,用逗号隔开:

TimeStamp, Gyro_X, Gyro_Y, Gyro_Z, Acc_X, Acc_Y, Acc_Z

【讨论】:

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