【问题标题】:Reading CSV data from a file从文件中读取 CSV 数据
【发布时间】:2012-09-02 05:14:49
【问题描述】:

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

文本文件有 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 = new Thing(v1, v2, v3, v4);

虽然,当我读到 5 条记录时,构造上述代码行的最佳方法是什么?由于每个对象都需要一个唯一的名称,有没有一种方法可以使用 for 循环和向量进行迭代? IE for (int i = 0; i

非常感谢任何提示

【问题讨论】:

标签: c++


【解决方案1】:

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

分词器类可能会回答您的问题(例如来自boostsimpler ones 的问题可用)。

你应该检查otherquestions关于这个主题。

【讨论】:

    【解决方案2】:

    如果可以,请注意@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,5\n"
                              "4.,5.,6.,80\n"
                              "4.,2.,6.,70\n"
                              "4.,5.,6.,86\n"
                              "2.,5.,9.,80\n");
            // 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;
        }
    

    可能有点太长了,但它可以节省您的时间。

    【讨论】:

      【解决方案3】:

      我会查看Using ifstream to read floats 并从解析逗号开始。 CSV 格式更复杂,但该示例应该可以帮助您入门。该示例使用String Toolkit,它非常擅长解析文本并转换为您需要的结构元素。

      【讨论】:

        猜你喜欢
        • 2014-01-07
        • 2019-09-17
        • 2019-05-03
        • 2023-03-04
        • 2018-11-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多