我有一个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;
}
我可以在不使用任何正式循环的情况下实现此任务,但它将变得一团糟,并且需要大量的代码行。
答案 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的用途为单数形式,然后添加您自己的属性并创建运算符以输入到结构/类中。
算法可以是:
好处:
缺点:
我现在将提供另一个选项,程序样式代码。
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解析库。
例如: