Excel文件数据的读取和处理方法——C++

1 引言

在进行算法分析的时候,一般需要输入数据进行分析,但是C++里面处理Excel文件里面的数据比较麻烦,可以结合matlab或者Python,先将.xls文件里面的数据进行读取和处理,然后再存为.csv格式的文件,C++去读取.csv文件里的数据供算法分析就会比较方便,流程图如下:

2 实操案例

2.1 matlab------.xls转换.csv

代码示例:

Matlab 复制代码
clc,clear;
%读取数据
path = 'test.xls';%Excel路径
data  = xlsread(path);%读取Excel文件里面的数据

%数据预处理
data = data +1;

%写入数据
target_path = 'test.csv';%要存放的csv文件路径
csvwrite(target_path,data);

代码解读:

使用matlab的作用有三个:

① 读取Excel文件里的数据;

② 对数据进行预处理,预处理为算法分析所需要的数据;

③ 另存为.csv格式的数据,供C++代码直接读取。

2.2 C++读取数据

C++的标准库可直接读取.csv文件,且读取起来比较方便。

代码示例:

cpp 复制代码
#include <iostream>  
#include <fstream>  
#include <sstream>  
#include <vector>  
#include <string>  

//.csv数据读取函数,返回数据,数据类型:vector<vector<string>>
std::vector<std::vector<std::string>> ReadCSV(const std::string& filename) {
	std::ifstream file(filename);
	std::vector<std::vector<std::string>> data;
	std::string line;

	while (std::getline(file, line)) {
		std::stringstream ss(line);
		std::string value;
		std::vector<std::string> row;

		while (std::getline(ss, value, ',')) {
			row.push_back(value);
		}
		data.push_back(row);
	}

	return data;
}

int main() {
	std::string filename = "test.csv";//绝对路径"E:\\05_VS_code\\Excel_Read\\Excel_Read\\test.csv";
	auto csvData = ReadCSV(filename);//获取.csv里的全部数据,vector<vector<string>>结构形式
	// 获取行数  
	size_t rowCount = csvData.size();
	// 获取列数(假设所有行都有相同的列数,取第一行的列数)  
	size_t colCount = (rowCount > 0) ? csvData[0].size() : 0;

	// 输出行数和列数  
	std::cout << "行数: " << rowCount << std::endl;
	std::cout << "列数: " << colCount << std::endl;

	// 获取第二列数据  
	std::vector<int> secondColumn;
	for (const auto& row : csvData) {
			secondColumn.push_back(std::stoi(row[1]));//遍历行,取每行第二列的数据。stoi,将string转换成int
	}

	// 提取算法分析所需要的数据,比如第二列数据  
	for (const auto& value : secondColumn) {
		std::cout << value << " ";
	}
	return 0;
}

代码解读:

① 定义一个.csv文件数据的函数,返回文件里面存放的数据,输入是文件存放路径,输出是数据,数据类型:vector<vector<string>>;

② 在主函数中调用该函数读取目标文件里的数据,路径可以是相对路径也可以是决定路径,相对路径时,文件存放在和.cpp文件同一目录下;

③ 通过size()方法获取数据的行数和列数;

④ 获取算法分析所需要的数据,比如第二列数据,采用遍历行的方式,每行取第二个元素,得到第二列数据,原始数据类型是string,需要转换成目标数据类型,比如示例采用stoi方法,将数据类型从string转换成int。

2.3 C++数据存储

算法分析完以后可以将结果数据存储下来,供后续可视化使用。

代码示例:

cpp 复制代码
#include <iostream>  
#include <fstream>  
#include <sstream>  
#include <vector>  
#include <string>  

//.csv数据读取函数,返回数据,数据类型:vector<vector<string>>
std::vector<std::vector<std::string>> ReadCSV(const std::string& filename) {
	std::ifstream file(filename);
	std::vector<std::vector<std::string>> data;
	std::string line;

	while (std::getline(file, line)) {
		std::stringstream ss(line);
		std::string value;
		std::vector<std::string> row;

		while (std::getline(ss, value, ',')) {
			row.push_back(value);
		}
		data.push_back(row);
	}

	return data;
}
//将数据写入.csv文件,写入的数据类型:vector<vector<string>>
void WriteCSV(const std::string& filename,const std::vector<std::vector<std::string>>& data) {
	std::ofstream file(filename);
	if (!file.is_open()) {
		throw std::runtime_error("无法打开文件: " + filename); // [3,5](@ref)
	}

	for (const auto& row : data) {
		for (size_t i = 0; i < row.size(); ++i) {
			file << row[i];                   // 写入字段
			if (i < row.size() - 1) file << ","; // 非最后字段加逗号
		}
		file << "\n";  // 行尾换行 [1,7](@ref)
	}
	file.close();      // 显式关闭流
}

int main() {
	//读取数据
	std::string filename = "test.csv";//绝对路径"E:\\05_VS_code\\Excel_Read\\Excel_Read\\test.csv";
	auto csvData = ReadCSV(filename);//获取.csv里的全部数据,vector<vector<string>>结构形式
	
	//数据分析
	csvData = csvData;

	//将数据写入文件
	std::string filename_new = "test_new.csv";
	WriteCSV(filename_new, csvData);
	return 0;
}

代码解读:

① 构建一个数据写入.csv文件的函数,输入是文件存放路径和要写入的数据,和之前的读取文件返回的数据一样;

② 代码的执行逻辑:先读取数据,数据经过算法分析后将数据写入到.csv文件。

3 扩展------数据可视化

一般数据分析完以后需要将结果可视化。同样的思路,在C++上数据处理完以后,将结果数据存放在.csv文件里面,然后用matlab或者Python去读取显示,因为matlab或者Python里面的可视化模块比较完善和简单。

相关推荐
kloc2 小时前
聊天室项目入口网关子服务的实现
linux·c++
csdn_aspnet5 小时前
C++ 3个有序点的方向(Orientation of 3 ordered points)
c++·算法
小七在进步6 小时前
string的使用(2)
c++
青少儿编程课堂7 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:折半搜索优化子集枚举(Meet in the Middle)解析
c++·python·算法·bfs·信息学竞赛
wo_jack9 小时前
C++ 入门笔记(十七):list 入门 —— 为什么 list 不能 sort?
数据结构·c++·面试·stl·list
GrowingIO技术社区9 小时前
分析云202611发版速览:7大硬核功能重磅升级!
数据分析·运营
仓库日记9 小时前
Excel进销存何时该换?用3项检查判断是否需要软件
经验分享·excel·进销存·开单软件
青少儿编程课堂10 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会Scratch考级:校园连连看解析
c++·python·算法·bfs·信息学竞赛
用户03321266636710 小时前
如何使用 Python 将 JSON 转换为 Excel
python·excel
草莓熊Lotso10 小时前
【C++ 基于微服务的即时通讯系统】文件存储子服务实战:UUID生成、文件IO封装与全接口单元测试
开发语言·网络·数据库·c++·微服务·架构·单元测试