将csv字符串读入向量C++

oxosxuxt  于 2023-09-28  发布在  其他
关注(0)|答案(1)|浏览(94)

有很多csv到vector的选项,包括read a csv file and and add its all data into vector in c++,但我想在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;
};
vmpqdwk3

vmpqdwk31#

如果你只需要在你的应用程序中创建一个解析器,你可以像这样构建一些简单的流递归解析器:

#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 = "\t\n\v\f\r ";
  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 ('\0' == *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,\r\nabc,2,ghi\r\njkl,2,pqr";
  std::vector<data> parsed = parse_csv(CSV);
  for(auto d: parsed) {
    std::cout << d << std::endl;
  }
  return 0;
}

如果你需要更复杂的东西,比如处理错误等使用一些CSV parsing library

相关问题