dduo518 / hexo-blog

hexo静态blog点击 https://github.com/chong0808/hexo-blog/issues
3 stars 0 forks source link

C++ csv库调研 #67

Open dduo518 opened 1 year ago

dduo518 commented 1 year ago

CSV(Comma Separated Values)是一种常见的文件格式,它以逗号作为分隔符来存储数据。在处理CSV文件时,使用一个好的CSV库可以使数据处理变得更加容易和高效。在本篇调研中,我们将对一些流行的C++ CSV库进行简要介绍和比较。

1、Fast C++ CSV Parser

Fast C++ CSV Parser是一个高效的CSV解析器,它只包含一个头文件,并且非常容易使用。它使用了 STL 中的 vector 和 string 容器来存储数据,使用了 RAII 的思想来自动管理内存,解析速度非常快。它具有以下特点:

该库的使用非常简单,只需包含头文件,然后使用解析器解析CSV文件即可。以下是一个简单的例子:


#include "csv.h"
#include <iostream>
using namespace std;

string file_path = "temp/group.csv";

/**
 * csvReader 读取
 */
void csvReader()
{
  cout << "==== csvReader ==== start" << endl;
  io::CSVReader<2> in(file_path);
  in.read_header(io::ignore_extra_column, "login", "group");
  std::string login;
  std::string group;
  double salary;
  while (in.read_row(login, group))
  {
    // 处理读取到的数据
    cout << "login:" << login << " group:" << group << endl;
  }
  cout << "==== csvReader ==== end" << endl;
  return;
}

/**
 * LineReader 按行读取
 *
 */
void lineReader()
{
  cout << "==== lineReader ==== start" << endl;
  io::LineReader csvLineReader(file_path);
  while (char *ret = csvLineReader.next_line())
  {
    cout << ret << endl;
  }
  cout << "==== lineReader ==== end" << endl;
  return;
}

int main()
{
  lineReader();
  csvReader();
  return 0;
}
==== lineReader ==== start
login,group
8815621,elvin
8815620,elvin
8815622,elvin
==== lineReader ==== end
==== csvReader ==== start
login:8815621 group:elvin
login:8815620 group:elvin
login:8815622 group:elvin
==== csvReader ==== end

缺点: fast-cpp-parser 只提供读csv的功能,不提供写入的功能

RapidCSV

Rapidcsv 是一个易于使用的 C++ CSV 解析器库。它支持 C++11(及更高版本),仅包含头文件并附带一个基本测试套件。

该库的 Github 仓库地址为:https://github.com/d99kris/rapidcsv

它具有以下特点:

csv-parse

C++中的csv-parser库旨在提供一种简单直观的语法来解析CSV文件,重点关注处理大型数据集时的性能和内存需求。它使用重叠线程、内存映射IO和高效的数据结构,以最小的内存占用解析文件。它还具有自动推测分隔符、处理注释以及处理不同长度行的能力。该库对编码无限制,可以处理ANSI和UTF-8编码的文件。它还拥有广泛的测试套件

它具有以下特点:


#include "csv.h"
#include <iostream>
using namespace std;

string file_path = "temp/01.csv";

void streamRead()
{
  csv::CSVReader reader(file_path);
  std::vector<std::string> headers = reader.get_col_names();
  // get file header
  for (std::string &header : headers)
  {
    cout << "header:" << header << endl;
  }
  // read data line
  for (csv::CSVRow &row : reader)
  {
    for (csv::CSVField &field : row)
    {
      std::cout << "read:" << field.get<std::string>() << endl;
    }
  }
  // indexing by column Names
  cout << "========" << endl;
  csv::CSVReader reader1(file_path);
  std::vector<std::string> headers1 = reader1.get_col_names();
  for (csv::CSVRow &row : reader1)
  {
    for (vector<string>::iterator header = headers1.begin(); header != headers1.end(); header++)
    {
      std::cout << "read: " << *header << "=" << row[*header].get<string>() << endl;
    }
  }
}

void converJSON()
{
  csv::CSVReader reader(file_path);
  std::stringstream my_json;
  std::vector<std::string> headers = reader.get_col_names();

  for (auto &row : reader)
  {
    my_json << row.to_json(headers) << std::endl;
  }
  std::cout << my_json.str() << std::endl;
}

int main()
{
  converJSON();
  return 0;
}