将csv字符串读取到向量C++中



csv到vector有很多选项,包括读取csv文件,并将其所有数据添加到c++中的vector中,但我想要高于或低于csv -> vector的内容。相反,我有一个CURL函数,它将csv数据加载到格式的std::string

col1,col2,col3
abc,2,ghi
jkl,2,pqr

每一行由n分隔。如何将此给定结构中的数据解析为std::vector<data>

数据看起来像

struct data
{
std::string col1, col3;
int col2;
};

如果它是应用程序中唯一需要封装的解析器,那么您可以构建一些简单的流式递归解析器,如下所示:

#include <cctype>
#include <cstring>
#include <vector>
#include <string>
#include <iostream>
struct data
{
std::string col1;
int col2;
std::string col3;
};
std::ostream& operator<<(std::ostream& to,const data& d)
{
to << d.col1 << ',';
to << d.col2 << ',';
to << d.col3;
}
static char* skip_spaces(const char* csv)
{
constexpr const char* WHITESPACE = "tnvfr ";
return const_cast<char*>( csv + std::strspn(csv,WHITESPACE) );
}

static const char* parse_csv_line(const char* csv, data& to)
{
char* b = skip_spaces(csv);
char* e = std::strchr(b,',');
to.col1 = std::string(b,e);
b = skip_spaces(e+1);
e = std::strchr(b,',');
to.col2 = std::strtol(b,&e,10);
b = skip_spaces(e+1);
e = std::strchr(b,'n');
if(nullptr == e) {
e = b + std::strlen(b);
}
to.col3 = std::string(b,e);
return ('' == *e) ? nullptr : e + 1;
}
std::vector<data> parse_csv(const char* csv)
{
std::vector<data> ret;
// skip header
csv = std::strchr(csv,'n');
while(nullptr !=  csv) {
data next;
csv = parse_csv_line(csv, next);
ret.push_back( next );
}
return ret;
}

int main(int argc, const char** argv)
{
const char* CSV = "col1,col2,col3,rnabc,2,ghirnjkl,2,pqr";
std::vector<data> parsed = parse_csv(CSV);
for(auto d: parsed) {
std::cout << d << std::endl;
}
return 0;
}

如果你需要更复杂的东西,例如处理错误等,请使用一些CSV解析库

最新更新