21xrx.com
2024-11-05 17:18:04 Tuesday
登录
文章检索 我的文章 写文章
C++解析CSV文件
2023-07-04 18:44:41 深夜i     --     --
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。

  
  

评论区

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