从CSV文件中提取每个条目字段的最佳方法是什么

Whats the best way to extract every entry Fields from CSV file

本文关键字:字段 最佳 是什么 方法 文件 CSV 提取      更新时间:2023-10-16

我有一个包含不同行的 CSV 文件,即标识符、标题、出版商和作者 1、作者 2...等。

现在,我正在尝试逐个提取每个字段并将其存储到适当的数据集中。例如:我将标题存储在字符串中,年份存储在 int 中。

这是我正在学习的 CSV 文件。 因为我正在尝试在C++中实现这一点。问题是总共有 10 个单独的作者字段,作者数量不同。我如何设计一个循环,其中它首先识别作者的总条目,然后开始复制到一些链表或数组等中。

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;

}

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

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

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中有超过1行,你需要一个向量或某种数组来存储来自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解析库。

这些是:

  • https://github.com/d99kris/rapidcsv
  • https://github.com/taocpp/PEGTL