21xrx.com
2025-03-30 17:08:46 Sunday
文章检索 我的文章 写文章
C++解析CSV文件
2023-07-04 18:44:41 深夜i     12     0
C++ CSV文件 解析

CSV(Comma-Separated Values)文件是一种简单的文件格式,常用于存储表格数据。在C++中解析CSV文件是一个非常常见的任务,本文将介绍如何使用C++解析CSV文件。

首先,我们需要明确CSV文件的结构。CSV文件由若干行组成,每一行是一个记录,每个记录由若干个字段组成。每个字段之间以逗号分隔,每一行以换行符结束。例如,下面是一个简单的CSV文件示例:

Name,Age,Gender
John,25,Male
Mary,30,Female

在C++中,我们可以使用fstream库来读取文件。首先,我们需要打开文件:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main() {
  fstream inFile("data.csv", ios::in);
  if (!inFile.is_open())
    cerr << "Failed to open file!" << endl;
    return 1;
  
  // continue reading file
  inFile.close();
  return 0;
}

接着,我们可以使用getline函数逐行读取文件,并将每行分割成字段:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
int main() {
  fstream inFile("data.csv", ios::in);
  if (!inFile.is_open())
    cerr << "Failed to open file!" << endl;
    return 1;
  
  vector<vector<string>> table;
  string line;
  while (getline(inFile, line)) {
    vector<string> row;
    size_t start = 0;
    size_t pos = line.find(',');
    while (pos != string::npos) {
      string field = line.substr(start, pos - start);
      row.push_back(field);
      start = pos + 1;
      pos = line.find(',', start);
    }
    string field = line.substr(start);
    row.push_back(field);
    table.push_back(row);
  }
  inFile.close();
  // print table
  for (const auto &row : table) {
    for (const auto &field : row) {
      cout << field << "\t";
    }
    cout << endl;
  }
  return 0;
}

上面的代码中,我们使用了vector >来存储整个表格。每一行对应一个vector ,整个表格是一个vector >。在读取每一行时,我们使用了string的substr函数来分割每个字段,并将其加入到当前行对应的vector中。

最后,我们可以很简单地遍历这个二维的vector,打印出整个表格。

当然,在实际开发中,我们可能遇到一些特殊情况,比如字段中包含逗号或换行符。这时候需要使用一些特殊的技巧来处理这些情况。不过,以上的代码已经能够处理大多数的CSV文件了。

在使用C++解析CSV文件时,我们需要注意一些性能问题。由于CSV文件可能非常大,每次读取一行都是一个非常耗时的操作。因此,我们应该使用流式读取(streaming)的方式,逐行读取文件,而不是一次性读入整个文件。此外,vector也是一个比较重的数据结构,对于非常大的表格,可能会占用过多的内存。在这种情况下,我们可以使用一些轻量级的数据结构,如数组或链表,来代替vector。

  
  

评论区

请求出错了