正在从文件中读取CSV数据

Reading CSV data from a file

本文关键字:读取 CSV 数据 文件      更新时间:2023-10-16

如果有人问我这个问题,我很抱歉,但我似乎找不到有帮助的解决方案。我正在尝试从文本文件中读取数据,并最终将其存储在对象中。

文本文件有4个变量,全部用逗号分隔。

我试着这样做:

string v1, v2, v3, v4;
ifstream afile;
afile.open("thefile.txt");
afile >> v1 >> v2 >> v3 >> v4;
afile.close();
cout << v1 << endl;
cout << v2 << endl;
cout << v3 << endl;
cout << v4 << endl;

该文件有多条记录。我现在试着只做1来确保它有效,但当它读取数据时,它不会在逗号处分开。

从那里,我想把数据存储到一个对象中。以下内容是否有效:Thing*thing1=新事物(v1,v2,v3,v4);

不过,当我读到5条记录时,构建上述代码行的最佳方式是什么?由于每个对象都需要一个唯一的名称,有没有一种方法可以让我迭代——也许可以使用for循环和向量?iefor(int i=0;i<5;i++){//读入数据//存储在矢量中}

任何提示都非常感谢

CSV格式比逗号分隔符更复杂。它可以包含引号,您应该对此进行转义和解释,并且可以允许使用不同的分隔符。如果您的输入文件没有严格格式化,那么您确实应该使用专用的CSV导入/导出库。

令牌化器类可能会回答您的问题(例如boost中的类或更简单的类)。

你应该检查一下关于这个主题的其他问题。

Heed@Soravux回答并在可能的情况下使用专门的库。特别是,他建议的strtk工具包看起来很有趣,而且只是一个单独的头。Boost也可以用至少5种不同的方式来实现,如果你打算使用C++一段时间,它是一个值得学习的库。也就是说,所有这些解决方案都会给你的程序增加一些复杂性,而且你很可能想把精力花在其他地方,特别是如果你只需要一个非常简单的数字阅读器的话。以下是如何使用标准C++(使用STL,例如矢量和流):

    #include <iostream>
    #include <sstream>
    #include <fstream>
    #include <string>
    #include <algorithm>
    #include <vector>
    using namespace std;
    vector<double> &split(const string &s, 
        char delim, vector<double> &elems) 
    {
        stringstream ss(s);
        string item;
        while (std::getline(ss, item, delim)) {
            stringstream conv( item );
            double number;
            conv >> number;
            elems.push_back(number);
        }
        return elems;
    }
    struct my_record_t{
        double f1, f2, f3, f4;
    };
    typedef vector<my_record_t> my_record_vector_t;
    int main( int argc, char* argv[])
    {
        stringstream  in("10,20,2.0,5n"
                          "4.,5.,6.,80n"
                          "4.,2.,6.,70n"
                          "4.,5.,6.,86n"
                          "2.,5.,9.,80n");
        // Or alternatively, :
        //    ifstream in("myfile.csv");
        // Here you store your records
        my_record_vector_t mrv;
        string line;
        vector< double > numbers; 
        while( std::getline( in, line, 'n' ) )
        {
            numbers.clear();
            split( line, ',', numbers);
            my_record_t r;
            r.f1 = numbers[0];
            r.f2 = numbers[1];
            r.f3 = numbers[2];
            r.f4 = numbers[3];
            mrv.push_back( r );
        }
        cout << mrv.size() << " records read" << endl;

        return 0;
    }

可能有点太长了,但它可以挽救你的一天。

我会研究使用ifstream读取浮点值,并从逗号解析开始。CSV格式更为复杂,但该示例应该让您开始使用。该示例使用字符串工具包,该工具包非常擅长解析文本并转换为所需的结构元素。