21xrx.com
2024-12-27 21:31:31 Friday
登录
文章检索 我的文章 写文章
C++如何高效读取CSV文件
2023-06-30 12:15:31 深夜i     --     --
C++ 高效 读取 CSV文件 文件IO

在数据分析和机器学习领域使用最广泛的数据格式之一就是CSV文件。CSV文件存储了基于逗号分隔的文本数据,可以使用各种编程语言读取和处理。然而,由于CSV文件可能包含大量数据,因此读取它们可能会很慢。在C++中,有几种方法可以高效地读取CSV文件,这篇文章将介绍其中一些。

1. 使用STL库的fstream类

在C++中,可以使用STL库的fstream类读取CSV文件。此方法的优点是它易于使用,但是它也可能不是最快的方法。

示例代码:


#include <iostream>

#include <fstream>

#include <sstream>

#include <vector>

using namespace std;

int main() {

  ifstream file("example.csv");

  vector<vector<string>> data;

  string line;

  while (getline(file, line)) {

    vector<string> row;

    stringstream ss(line);

    string cell;

    while (getline(ss, cell, ',')) {

      row.push_back(cell);

    }

    data.push_back(row);

  }

  for (auto& row : data) {

    for (auto& cell : row)

      cout << cell << " ";

    

    cout << "\n";

  }

  return 0;

}

在此示例中,我们读取名为"example.csv"的CSV文件,并将每行数据存储在二维向量"vector > data"中。为了将每行数据拆分成单个单元格,我们使用stringstream类和getline函数。最后,我们遍历数据并打印它们。

2. 使用C语言的fread函数

C语言的fread函数是另一种读取CSV文件的方法。与fstream相比,它可能更快,因为它可以一次读取多个字节。

示例代码:


#include <stdio.h>

#include <stdlib.h>

int main() {

  FILE* file = fopen("example.csv", "r");

  char buffer[1024];

  while (fgets(buffer, 1024, file)) {

    char* cell = strtok(buffer, ",");

    while (cell != NULL) {

      printf("%s ", cell);

      cell = strtok(NULL, ",");

    }

    printf("\n");

  }

  return 0;

}

在此示例中,我们使用fopen函数打开"example.csv"文件,然后使用fgets和strtok函数读取并拆分数据。最后,我们遍历数据并打印它们。

3. 使用第三方库

除了STL和C标准库外,还可以使用第三方库来读取CSV文件。其中一些库包括CSVReader,RapidCSV和tinyCSV。

示例代码:

使用CSVReader库:


#include <iostream>

#include "csvreader.h"

int main() {

  CSVReader reader("example.csv");

  for (auto& row : reader.data) {

    for (auto& cell : row)

      std::cout << cell << " ";

    

    std::cout << "\n";

  }

  return 0;

}

使用RapidCSV库:


#include <iostream>

#include "rapidcsv.h"

int main() {

  rapidcsv::Document doc("example.csv");

  for (int i = 0; i < doc.GetRowCount(); ++i) {

    for (int j = 0; j < doc.GetColumnCount(); ++j) {

      std::cout << doc.GetCell<std::string>(j, i) << ", ";

    }

    std::cout << "\n";

  }

  return 0;

}

使用tinyCSV库:


#include <iostream>

#include "tinycsv.h"

int main() {

  std::vector<std::vector<std::string>> data = tinycsv::parse_file("example.csv");

  for (auto& row : data) {

    for (auto& cell : row)

      std::cout << cell << " ";

    

    std::cout << "\n";

  }

  return 0;

}

这些库中的每一个都具有其独特的语法和功能,但其中一些可能比其他工具更快或更适合特定的数据集。 这些工具还提供其他有用的功能,例如更好的错误处理,缺失值处理等。

总结

读取CSV文件是许多数据分析和机器学习应用程序的重要部分。虽然C++中可以使用多种方法读取CSV文件,但其中的许多方法可能比其他方法更快或更适合特定的应用程序。使用这些方法之一可以帮助您高效地读取CSV文件并处理数据。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复