从CSV文件提取每个输入字段的最佳方法是什么

时间:2019-06-05 10:20:16

标签: c++ csv

我有一个CSV文件,其中包含不同的行,即标识符,标题,发布者以及Authors1,Authors2 ...等。

现在,我正在尝试一个字段一个一个地提取每个字段,并将其存储到适当的数据集中。例如:我将标题存储在String中,像这样将year存储在int中。

This is the CSV file I'm learning on. 当我试图在C ++中实现这一点时。问题是总共有10个单独的Author字段,其中作者的数量不同。我该如何设计一个循环,在该循环中,它首先标识“作者”的总条目,然后将副本启动到某些链接的列表或数组等中。

int main(){

ifstream myFile("BibtexFileCSV.csv");

if(!myFile.is_open()){
    cout<<"File failed to open"<<endl;
    return 0;
}

string identifier;
string title;
string journal;
string month;
string year;
string publisher;
string author;

string line;

while(getline(myFile, line)){

    string chars="{}""";
    for (char c: chars){
        line.erase(std::remove(line.begin(), line.end(), c), line.end());
        line.erase(std::remove(line.begin(),line.end(),'\"'),line.end());
    }

    stringstream ss(line);
    getline(ss, identifier, ',');
    getline(ss, title, ',' );
    getline(ss, journal, ',');
    getline(ss, month, ',');
    getline(ss, year, ',');
    getline(ss, publisher, ',');

    vector <string> authors;

    string lastName;
    string firstName;

    int i=0;
    while(i <= 1 ){
        getline(ss, author, ',');
        authors.push_back(author);
        i++;
    }       

    cout<<publisher +" : ";
    for (unsigned int j=0; j < 2; j++){

        string n = authors.at(j);

        stringstream names(n);

        getline(names, lastName, ' ');
        getline(names, firstName);
        cout<<firstName;
    }

    cout<<firstName;
    cout<<" "+lastName;
    cout<<endl;
}

myFile.close();
return 0;

}

我可以在不使用任何正式循环的情况下实现此任务,但它将变得一团糟,并且需要大量的代码行。

1 个答案:

答案 0 :(得分:0)

最简单的方法是为类似操作创建函数。例如,您重复字符串流很多次,以将每个元素拆分为自己的元素。更好地做一个功能

auto explode(const string& s, const char& c) -> vector<string>
{
    string buff{ "" };
    vector<string> v;

    for (auto n : s)
    {
        if (n != c) buff += n; else
            if (n == c && buff != "") { v.push_back(buff); buff = ""; }
    }
    if (buff != "") v.push_back(buff);

    return v;
}

然后可以重用该功能。另一件事使您的生活更轻松,您知道此CSV中有多于一行,并且您需要一个向量或某种数组来存储CSV中的所有信息,并准备一个具有与您的匹配的适当名称的结构/类CSV的用途为单数形式,然后添加您自己的属性并创建运算符以输入到结构/类中。

算法可以是:

  • 浏览标题(例如ID,名称,作者等)一次
  • 循环直到文件到达末尾
  • 使用定界符获取CSV的每一行,并使用上述函数将每一列拆分为字符串数组/向量。
  • 使用您自己的运算符输入结构/类

好处:

  • 代码将更容易理解
  • 短一点
  • 更简单

缺点:

  • 初学者很难理解

我现在将提供另一个选项,程序样式代码。

vector<string> lines;

  fstream file;
  file.open("book.csv");

  string line
  while (getline( file, line,'\n'))
    {
      istringstream templine(line); 
      string data;

      while (getline(templine, data,','))
        lines.push_back(data);  

    }
  file.close();

使用上述代码,打开文件,创建名为line的临时变量来存储每一行​​,然后在满足定界符,之前再次遍历每个字符串。

还有第三个选项,您可以使用第三方CSV解析库。

例如: