从CSV文件中提取每个条目字段的最佳方法是什么
Whats the best way to extract every entry Fields from CSV file
我有一个包含不同行的 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
相关文章:
- 将结构字段的类型展开为可变模板参数
- 将位字段导出到数组
- 为了方便起见,我应该避免公开私有字段变量吗
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 在java中读取c++字节的位字段
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- 私有字段对象与私有继承?
- 声明没有默认构造函数的字段
- C++内存模型和位字段的最大序列
- 声明为无效的变量或字段'...' Ardunio 编译器上的错误
- 如何在QByteArray中放置和检索位字段而不会感到痛苦?
- C++ win32 如何使密码字段可选并启用复制和粘贴?
- 如何通过UDP接收QByteArray并将其解析为位字段结构?
- 仅匹配集合中的某些字段
- 结构字段名称与 GDB 中的 STL 数组冲突
- 如何使用位字段将数据从二进制文件复制到结构中?
- 从CSV文件中提取每个条目字段的最佳方法是什么
- 修改Boost多索引项的非索引字段的最佳方法:modify vs mutable
- C# 与 C/C++:我是否需要手动对结构字段进行排序以获得最佳性能
- 在c++中设置较低层次私有字段的最佳实践