使用2D数组读取CSV文件

时间:2018-12-05 08:49:10

标签: c++ file csv

我正在尝试使用2d数组读取CSV文件,但是读取存在问题。文件的第一个单元格将被跳过,然后继续读取所有内容。我不明白为什么它不读取第一个单元格。

#include<iostream>
#include<fstream>
#include<cstring>
#include<string>
#include<sstream>
using namespace std;

int main()
{
  string arrival,job[3][4];
  ifstream jobfile("myfile.csv");
  std::string fileCommand;

  if(jobfile.is_open())
  {
      cout << "Successfully open file"<<endl;

      while(getline(jobfile,arrival,','))
      {
        for(int i=1;i < 4;i++) //i = no. of job
        {
            for(int j=0; j<4; j++) // j = no. of processes
            {
                getline(jobfile,job[i][j],',');
                cout << "Job[" << i << "]P[" << j << "]: "<< job[i][j]<< endl;
            }

        }//end for
      }//end while
  }//end if for jobfile open
  jobfile.close();    
}

1 个答案:

答案 0 :(得分:1)

更改此:

for(int i=1;i < 3;i++)

对此:

for(int i=0;i < 3;i++)

另外,请删除此getline(jobfile,job[i][j],',');,因为这样会跳过一行。在while循环的条件下调用getline时,它已经读取了一行(因此,现在必须存储该行。然后,当while循环的条件再次被求值时,将读取下一行)。


但是,它变得比这复杂得多,因为您arrival一次将持有一个令牌,直到遇到当前行的最后一个令牌。在这种情况下,arrival将是这样:"currentLineLastToken\nnextLineFirstToken"

由于这个原因,您需要专门处理到达包含换行符的情况,为此请使用string::find

找到换行符后,应将该字符串拆分为该换行符,以提取所涉及的两个标记。为此,请使用string::substr

此外,您不应该在while循环内循环使用双精度来存储令牌,您只需阅读即可。仅在退出读取文件的while循环之后,才需要打印job时使用double for循环。

将所有内容放在一起,我们得到了:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main()
{
  string arrival,job[3][4];
  ifstream jobfile("myfile.csv");
  std::string fileCommand;

  if(jobfile.is_open())
  {
      cout << "Successfully open file"<<endl;

      int i = 0, j = 0;
      while(getline(jobfile,arrival,','))
      {
        //cout << "|" << arrival << "|" << endl;
        size_t found = arrival.find("\n");
        if (found != std::string::npos) // if newline was found
        {
                string lastToken = arrival.substr(0, found);
                string nextLineFirstTOken = arrival.substr(found + 1);
                job[i++][j] = lastToken;
                j = 0;
                if(nextLineFirstTOken != "\n") // when you read the last token of the last line
                        job[i][j++] = nextLineFirstTOken;
        }
        else
        {
                job[i][j++] = arrival;
        }

      }//end while

      for(int i = 0; i < 3; ++i)
      {
        for(int j = 0; j < 4; ++j)
        {
                cout << job[i][j] << " ";
        }
        cout << endl;
      }

  }//end if for jobfile open
  jobfile.close();
}

输出(用于我的自定义输入):

Successfully open file
aa bb cc dd 
bla blu blo ble 
qq ww ee rr