C++读写CSV文件


前言

平常使用python处理csvnumpy库和pandas库非常方便,现在有任务需要使用c++处理csv文件,这里记录一下处理csv的代码。这里将每个小格中的数据按照字符串推入到vector中。


下面我们以这个表格做示例代码.
nameincomeexpenditureaddress
zhangsan30001200中国 北京市
lisi2032.5789.2中国 陕西省

这里尽量包含字符串、整型、浮点数、汉字多个类型

一、基础准备

1、数据类型转换函数

字符串和其他数据类型转换 (<stdlib.h>中的函数)

函数原类型转换类型example
atofstringdoubleatof("0.3") => 0.3
atoistringintegeratoi("123") => 123
atolstringlong integeratol("123") => 123
atollstringlong long integeratoll("123") => 123
std::to_stringint|float|double|...stringto_string(0.3) => “0.3”

2、行数据读取与分割

这里使用std::getline(),可以类似python的字符串分割split
有兴趣的可以自行封装一个返回vector类型的函数

先介绍一下函数std::getline()

 // C++内部文件描述
template<typename _CharT, typename _Traits, typename _Alloc>
    basic_istream<_CharT, _Traits>&
    getline(basic_istream<_CharT, _Traits>& __is,
	    basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim);

//Read a line from stream into a string.

//Parameters:
//__is – Input stream.  //输入流
//__str – Buffer to store into.  //每个word存储地址
//__delim – Character marking end of line.  //分隔符

//Returns:
//Reference to the input stream. Stores characters from __is into __str until __delim is 
//found, the end of the stream is encountered, or str.max_size() is reached. Any previous
//contents of __str are erased. If __delim is encountered, it is extracted but not stored
//into __str.

二、csv文件写入

代码如下(示例):

#include <iostream>
#include <fstream>

int main()
{
    std::ofstream outFile;
    outFile.open("test.csv", std::ios::out | std::ios::trunc);
    // 写入标题行
    outFile << "name" << ','
            << "income" << ','
            << "expenditure" << ','
            << "addr" << std::endl;
    // ********写入两行数据*********
    // 写入字符串(数字)
    outFile << "zhangsan" << ','
            << "3000" << ','
            << "1200" << ','
            << "中国 北京市" << std::endl;
    // 写入浮点数(转为字符串)
    outFile << "lisi" << ','
            << std::to_string(2032.1) << ','
            << std::to_string(789.2) << ','
            << "中国 陕西省" << std::endl;
    outFile.close();
    return 0;
}

二、csv文件读取

代码如下:

#include <iostream>
#include <istream>
#include <streambuf>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>
#include <stdlib.h>

int main()
{
    std::ifstream csv_data("test.csv", std::ios::in);
    std::string line;

    if (!csv_data.is_open())
    {
        std::cout << "Error: opening file fail" << std::endl;
        std::exit(1);
    }

    std::istringstream sin;         //将整行字符串line读入到字符串istringstream中
    std::vector<std::string> words; //声明一个字符串向量
    std::string word;

    // 读取标题行
    std::getline(csv_data, line);
    // 读取数据
    while (std::getline(csv_data, line))
    {
        sin.clear();
        sin.str(line);
        words.clear();
        while (std::getline(sin, word, ',')) //将字符串流sin中的字符读到field字符串中,以逗号为分隔符
        {
            words.push_back(word); //将每一格中的数据逐个push
            std::cout << word;
            // std::cout << atol(word.c_str());
        }
        std::cout << std::endl;
        // do something。。。
    }
    csv_data.close();
    return 0;
}

三、demo–读写

#include <iostream>
#include <fstream>
#include <istream>
#include <sstream>
#include <streambuf>
#include <vector>
#include <string>
#include <stdlib.h>

void printCsv(std::vector<std::string> line_data)
{
	std::cout << line_data[0]
		    //   << atof(line_data[1].c_str())
			//   << atof(line_data[2].c_str())
			  << line_data[1]
			  << line_data[2]
			  << line_data[3]
			  << std::endl;
}

int main()
{
	std::ifstream csv_data("test.csv", std::ios::in);
	std::string line;

	if (!csv_data.is_open())
	{
		std::cout << "Error: opening file fail" << std::endl;
		std::exit(1);
	}

	std::vector<std::string> words; //声明一个字符串向量
	std::string word;
	// ------------读取数据-----------------
	// 读取标题行
	std::getline(csv_data, line);
	std::istringstream sin;
	// 按行读取数据
	while (std::getline(csv_data, line))
	{
		// 清空vector,只存当前行的数据
		words.clear();
		sin.clear();
		sin.str(line);
		while (std::getline(sin, word, ',')) //将字符串流sin中的字符读到field字符串中,以逗号为分隔符
		{
			std::cout << word << std::endl;
			words.push_back(word); //将每一格中的数据逐个push
		}
		printCsv(words);	
	}
	csv_data.close();
	std::ofstream outFile;
	outFile.open("test.csv", std::ios::out | std::ios::trunc);
	// 写入标题行
	outFile << "name" << ','
			<< "income" << ','
			<< "expenditure" << ','
			<< "addr" << std::endl;
	// ********写入两行数据*********
	// 写入字符串(数字)
	outFile << "zhangsan" << ','
			<< "3000" << ','
			<< "1200" << ','
			<< "中国 陕西省" << std::endl;
	// 写入浮点数(转为字符串)
	outFile << "lisi" << ','
			<< std::to_string(2032.1) << ','
			<< std::to_string(789.2) << ','
			<< "中国 北京市" << std::endl;
	outFile.close();
	return 0;
}

参考

https://www.jianshu.com/p/fed5cf34bacf

  • 52
    点赞
  • 229
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
C++读写csv文件,可以使用STL库中的fstream和sstream。具体步骤如下: 1. 包含头文件: ```c++ #include <fstream> #include <sstream> #include <iostream> #include <string> #include <vector> ``` 2. 定义读取csv文件的函数: ```c++ // 读取csv文件 std::vector<std::vector<std::string>> readCsv(std::string filename) { std::vector<std::vector<std::string>> data; // 存储csv文件中的数据 std::ifstream file(filename); // 打开csv文件 std::string line; // 存储每行数据的字符串 while (std::getline(file, line)) { // 逐行读取csv文件 std::vector<std::string> row; // 存储每行数据的向量 std::stringstream ss(line); // 将每行数据的字符串转换为流 std::string cell; // 存储每个单元格的字符串 while (std::getline(ss, cell, ',')) { // 逐个单元格读取每行数据 row.push_back(cell); // 将单元格的字符串添加到每行数据的向量中 } data.push_back(row); // 将每行数据的向量添加到存储csv文件数据的向量中 } return data; // 返回存储csv文件数据的向量 } ``` 3. 定义写入csv文件的函数: ```c++ // 写入csv文件 void writeCsv(std::string filename, std::vector<std::vector<std::string>> data) { std::ofstream file(filename); // 创建csv文件 for (auto row : data) { // 逐行写入csv文件 for (auto cell : row) { // 逐个单元格写入每行数据 file << cell << ','; // 将单元格的字符串写入csv文件,并添加逗号分隔符 } file << std::endl; // 每行数据写入完成后,添加换行符 } file.close(); // 关闭csv文件 } ``` 4. 调用读取和写入csv文件的函数: ```c++ int main() { std::string filename = "data.csv"; // csv文件路径 std::vector<std::vector<std::string>> data = readCsv(filename); // 读取csv文件 writeCsv("new_data.csv", data); // 将读取csv文件数据写入新的csv文件 return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值