c ++如何从.csv文件中读取值并将它们存储在向量中?

时间:2013-07-16 15:56:30

标签: c++ csv vector

我在Windows 7上使用Code :: Blocks从.cpp文件制作小.exe,我是初学者(对不起!)

这是今天的问题:

我有一个包含长整数(从0到2 ^ 16)的.csv文件,用分号分隔,并列为一系列水平线。

我将在这里做一个简单的例子,但实际上文件可以达到2Go大。

假设我的文件wall.csvNotepad++等文本编辑器中显示如下:

350;3240;2292;33364;3206;266;290

362;314;244;2726;24342;2362;310

392;326;248;2546;2438;228;314

378;334;274;2842;308;3232;356

奇怪的是,它在Windows notepad

中显示如下
350;3240;2292;33364;3206;266;290
362;314;244;2726;24342;2362;310
392;326;248;2546;2438;228;314
378;334;274;2842;308;3232;356

无论如何,

让我们说我会知道并将在3 float个变量中声明列数,行数和文件中的值。

int col = 7;   // amount of columns
int lines = 4; // amount of lines
float x = 0;     // a variable that will contain a value from the file  

我想:

  1. 创建vector <float> myValues
  2. 使用第一行csv
  3. 中的每个值执行myValues.push_back(x)
  4. 使用第二行csv
  5. 中的每个值执行myValues.push_back(x)
  6. 使用第3行等中的每个值执行myValues.push_back(x)
  7. 直到文件完全存储在矢量myValues中。

    我的问题:

    我不知道如何连续为变量x分配csv文件中的值。

    我该怎么做?


    好的,这段代码可以工作(相当慢但是没问题!):

    #include <iostream>
    #include <fstream>
    #include <vector>
    using namespace std;
    
    int col = 1221;   // amount of columns
    int lines = 914; // amount of lines
    int x = 0;     // a variable that will contain a value from the file
    
    vector <int> myValues;
    
    int main() {
    
        ifstream ifs ("walls.tif.csv");
    
        char dummy;
        for (int i = 0; i < lines; ++i){
            for (int i = 0; i < col; ++i){
                ifs >> x;
                myValues.push_back(x);
                // So the dummy won't eat digits
                if (i < (col - 1))
                    ifs >> dummy;
            }
        }
        float A = 0;
        float B = col*lines;
    
        for (size_t i = 0; i < myValues.size(); ++i){
    
            float C = 100*(A/B);
            A++;
            // display progress and successive x values
            cout << C << "% accomplished, pix = " << myValues[i] <<endl;
        }
    }
    

2 个答案:

答案 0 :(得分:3)

将文字数据放入stringstream并使用std::getline

它需要一个可选的第三个参数"end-of-line"字符,但您可以使用;而不是真实的end of line

呼叫 while (std::getline(ss, str, ';')) {..}

并且每个循环将文本放在std::string中。

然后你需要转换为数字数据类型并推入向量,但这将使你开始。

另外,为什么使用floats作为列数和行数?

它们是整数值。

答案 1 :(得分:2)

尝试使用C ++标准模板库的输入操作。

制作一个虚拟字符变量以占用分号,然后将数字加入x变量,如下所示:

char dummy;
for (int i = 0; i < lines; ++i){
    for (int i = 0; i < col; ++i){
        cin >> x;
        myValues.push_back(x);
        // So the dummy won't eat digits
        if (i < (col - 1))
            cin >> dummy;
    }
}

要这样做,您可以将csv文件重定向为从命令行输入,如下所示:

yourExecutable.exe < yourFile.csv

循环填充数据的向量:

for (size_t i = 0; i < myVector.size(); ++i){
    cout << myVector[i];
}

上面,size_t类型由STL库定义,用于抑制错误。

如果您只想使用这些值,在使用它们时将它们从容器中删除,最好使用std :: queue容器。这样,你使用front()查看front元素,然后使用pop()删除它。