将csv文件进行读取,并将其内容打印在屏幕上。

实现方法:

本文采用map(int,string)对csv文本的每一行进行存储。其中int为行号,而string对应每行的内容。而csv的每一行,又以map(int,string)进行存储,其中int表示列号,string表示该列存储的内容。从而实现对整个csv文本按照类似矩阵的方式进行存储。

1)先将csv的内容逐行读取到map<int, string> stringMap中

2)通过迭代器遍历每一行,对每一行的数据以逗号作为分割符,将分割之后的字符串存储于vector<string> stringVec中

3)将vector<string> stringVec中已经分割好的字符串,按照列号,顺序存储于map<int string> stringMapTemp中

4)将map<int string> stringMapTemp按照行号存储到map<int, map<int, string>> m_stringMap中

部分代码如下:

map<int, string>::iterator iter = stringMap.begin();//遍历每一行字符串 for (; iter != stringMap.end(); ++iter) vector<string> stringVec;//存储按照逗号分隔好的数据 map<u32, string> stringMapTemp; assert(GetParamFromString(iter->second, stringVec) > 0); vector<string>::size_type idx = 0; for (; idx != stringVec.size(); ++idx) stringMapTemp[idx + 1] = stringVec[idx];// m_stringMap[iter->first] = stringMapTemp;//每一行的存储情况


完整 代码如下:

#include <assert.h>
#include <map>
#include <vector>
#include <string>
#include <stdio.h>
#include <iostream>
using namespace std;
typedef unsigned long   u32;
class OperateCSV
private:
	map<u32, map<u32, string>> m_stringMap;
	string m_CSVName;
public:
	OperateCSV(){}
	OperateCSV(const char *path)
		assert(LoadCSV(path));
	~OperateCSV(){}
	bool LoadCSV(const char *path);
	bool SaveCSV(const char *path = NULL);
	bool GetIntValue(u32 uiRow, u32 uiCol, int &riValue);
	bool GetFloatValue(u32 uiRow, u32 uiCol, float &rfValue);
	string* GetStringValue(u32 uiRow, u32 uiCol);
	int GetParamFromString(string str, vector<string> &stringVec, char delim  = ',');//根据逗号,进行字符串的分隔
	map<u32, map<u32, string>>& GetCSVMap()
		return m_stringMap;
bool OperateCSV::LoadCSV(const char *path)
	FILE *pFile = fopen(path, "r");
	if (pFile)
		fseek(pFile, 0, SEEK_END);//重定位流上的文件指针.其作用是将位置指针移到离文件头0个字节处,即放在文件开头
		u32 uSize = ftell(pFile);//用来获取文件的当前读写位置,返回值是当前读写位置偏离文件头部的字节数.用以衡量数据量
		rewind(pFile);//使文件pFile的位置指针指向文件开始。
		char *fileBuffer = new char[uSize];//
		fread(fileBuffer, 1, uSize, pFile);//用来读入一个数据块
		map<u32, string> stringMap;
		u32 uiIndex = 1;
		char *pBegin = fileBuffer;//字符串的首地址
		char *pEnd = strchr(pBegin, '\n');//在一个字符串中查找一个特定的字符
		pBegin = pEnd + 1;//第二行的起始,舍弃了第一行
		pEnd = strchr(pBegin, '\n');
		while (pEnd)
			string strTemp;
			strTemp.insert(0, pBegin, pEnd-pBegin);
			assert(!strTemp.empty());
			stringMap[uiIndex++] = strTemp;//将每一行的字符串存到map中,key为顺序号,value为字符串
			pBegin = pEnd + 1;
			pEnd = strchr(pBegin, '\n');//寻找下一行
		delete []fileBuffer;
		fileBuffer = NULL;
		pBegin = NULL;
		pEnd = NULL;
		map<u32, string>::iterator iter = stringMap.begin();//遍历每一行字符串
		for (; iter != stringMap.end(); ++iter)
			vector<string> stringVec;//存储按照逗号分隔好的数据
			map<u32, string> stringMapTemp;
			assert(GetParamFromString(iter->second, stringVec) > 0);
			vector<string>::size_type idx = 0;
			for (; idx != stringVec.size(); ++idx)
				stringMapTemp[idx + 1] = stringVec[idx];//
			m_stringMap[iter->first] = stringMapTemp;//每一行的存储情况
		fclose(pFile);
		m_CSVName = path;
		return true;
		return false;
bool OperateCSV::SaveCSV(const char *path /* = NULL */)
	if (path != NULL)
		m_CSVName = path;
	FILE *pFile = fopen(m_CSVName.c_str(), "w");
	if (pFile)
		map<u32, map<u32, string>>::iterator iter = m_stringMap.begin();
		for (; iter != m_stringMap.end(); ++iter)
			map<u32, string> &rStringMap = iter->second;
			map<u32, string>::iterator it = rStringMap.begin();
			for (; it != rStringMap.end(); ++it)
				string strTemp = it->second;
				strTemp += ',';
				fwrite(strTemp.c_str(), 1, 1, pFile);
			char delim = '\n';
			fwrite(&delim, 1, 1, pFile);
		fclose(pFile);
		return true;
		return false;
bool OperateCSV::GetIntValue(u32 uiRow, u32 uiCol, int &riValue)
	string *pStr = GetStringValue(uiRow, uiCol);
	if (pStr)
		riValue = atoi(pStr->c_str());
		return true;
		return false;
bool OperateCSV::GetFloatValue(u32 uiRow, u32 uiCol, float &rfValue)
	string *pStr = GetStringValue(uiRow, uiCol);
	if (pStr)
		rfValue = atof(pStr->c_str());
		return true;
		return false;
string* OperateCSV::GetStringValue(u32 uiRow, u32 uiCol)
	map<u32, map<u32, string>>::iterator iter = m_stringMap.find(uiRow);//因为刚好行号为关键字,所以可以用find进行查找
	if (iter != m_stringMap.end())
		map<u32, string> &rStrMap = iter->second;
		map<u32, string>::iterator it = rStrMap.find(uiCol);
		if (it != rStrMap.end())
			return &(it->second);
			return NULL;
		return NULL;
//用于分割字符串,将CSV表格中的一行按照规则解析成一组字符串,存储在一个vector中
//根据CSV表格中所存储的数据的不同,重载各函数
int OperateCSV::GetParamFromString(string str, vector<string> &stringVec, char delim)
	char *token = strtok(const_cast<char *>(str.c_str()), &delim);
	while (token)
		string strTemp = token;
		stringVec.push_back(strTemp);
		token = strtok(NULL, &delim);
	return stringVec.size();
void main()
	OperateCSV cs("9_9-1.csv");
	map<u32, map<u32, string>> stringMap = cs.GetCSVMap();
	map<u32, map<u32, string>>::iterator iter = stringMap.begin();
	for (; iter != stringMap.end(); ++iter)
		map<u32, string> strmap = iter->second;
		map<u32, string>::iterator it = strmap.begin();
		for (; it != strmap.end(); ++it)
			cout<<it->second<<"  ";
			cout<<endl;
	string *ss=cs.GetStringValue(2,1);
	string st = ss->c_str();
	cout<<*ss<<" "<<st<<endl;
                    背景需求:将csv文件进行读取,并将其内容打印在屏幕上。实现方法:本文采用map(int,string)对csv文本的每一行进行存储。其中int为行号,而string对应每行的内容。而csv的每一行,又以map(int,string)进行存储,其中int表示列号,string表示该列存储的内容。从而实现对整个csv文本按照类似矩阵的方式进行存储。1)先将csv的内容逐行读取到m
				
CSV文件作为一种简单易用的信息存储文件,有着非常广泛的用途,在游戏开发行业的应用尤为普遍,它比普通ini文件记录信息更加方便,具有更加严谨的格式信息,同时又没有数据库存储数据那么复杂。 它的记录形式通常以逗号为字段间分隔符,以回车为每条记录间分割符的简单文本格式,通过Excel打开如下所示: 通过普通通文本编辑器打开,如下图所示: 通过上面的图示,可知csv记录的信息实际上就是
标准库map类型是一种以键-值(key-value)存储的数据类型。可以理解为多样化的数组类型。 数组类型只能是int-int的,map的key和value可以随意更换,选择自己需要的数据类型。 mapSTL的一个关联容器,它提供一对一的hash。 第一个可以称为关键字(key),每个关键字只能在map中出现一次; 第二个可能称为该关键字的值(value); map以模板(泛型)方式实现,可以存储任意类型的数据,包括使用者自定义的数据类型。Map主要用于资料一对一映射(one-to-one)的情況
//从文件中获取数据,并转化为list(list里面放的是mapmap中放的是一一对应的数据)) ArrayList<Map<String, String>> datas = new ArrayList<>(); try { FileReader localFile = new FileReader(fi...
  自己平时操作文件用的不多,今天小伙伴让帮忙写一下这个,顺便记一下。实现功能:从"翻译.csv"文件读取出字符串,以","作为分隔符,将每一行对应存入map中。 #include <iostream> #include <fstream> #include <string> #include <vector> #inclu...
文章目录第七周 文件和数据格式化文件的使用实例11:自动轨迹绘制一维数据的格式化和处理二维数据的格式化和处理模块6:wordcloud库实例12:政府工作报告词云 第七周 文件和数据格式化 文件的使用 文件的两种展示形态:文本文件和二进制文件,但都以二进制01形成存储 文本文件:有统一编码 二进制文件:在01之上没有任何编码 以文本形式打开文件: 以二进制形式打开文件文件的打开关闭...
近段时间公司业务需要读写csv文件,网上搜来搜去没找到完善的库,其实我的要求的真不高,只是要求c或者c++语言,跨平台,结果愣是没有,后来从朋友那里找来一份他自己写的代码,用着还不错,现在拿出来给大家分享 这份代码是比较完善的,读取,修改,删除功能都有提供,windows,linux下皆可运行 windows下的示例下载地址: https://download.csdn.ne... 这份代码大部分是某位博主写的,只是我复制下来使用的时候,对于获取的结果加上了自己的一些限制条件,但是现在又忘记了那个博主的链接,真的是遗憾。 static void ReadCsv(string CsvPath) using (var sr = new System.IO.StreamReader(CsvPath)) C语言并不直接支持读取csv文件,需要依赖第三方库进行操作。其中一种常用的库是libcsv。 使用libcsv需要两个步骤:首先是读取文件并解析csv格式,然后是调用元素。 读取文件可以使用csv_parse函数,该函数需要传入数据源、数据源长度和回调函数指针等参数。在回调函数中,会接收到解析出来的每一个元素。可以在这个函数中将元素存储到数组或结构体中。 调用元素时,只需要访问数组或结构体中相应的元素即可。例如,如果csv文件中有三个字段,分别是编号、姓名和年龄,可以定义一个结构体包含这三个字段,然后在回调函数中依次解析每个字段,并将其存储到结构体中。最后,每次调用元素时只需要访问结构体中对应的字段即可。 需要注意的是,csv文件中的每个元素都需要进行正确的类型转换,并且需要处理一些特殊字符和异常情况,例如逗号和双引号等。因此,在使用libcsv进行csv文件处理时,需要仔细考虑这些细节。 ### 回答2: CSV是一种常见的文本格式,它代表逗号分隔值,可以通过电子表格和数据库程序进行使用。CSV文件包含多个行和列,行代表每个数据记录,而列代表每个数据字段。在Python中,可以使用csv模块来读取和操作CSV文件。 要读取CSV文件并调用元素,首先需要导入csv模块。接下来,使用csv.reader()函数打开CSV文件并创建一个读取器对象。这个读取器对象可以用于迭代CSV文件中的每个数据行,让我们可以访问CSV文件中的每个元素。 使用for循环迭代读取器对象,可以逐行读取CSV文件并打印出每个元素。例如: import csv with open('example.csv', newline='') as csvfile: reader = csv.reader(csvfile) for row in reader: print(row) 在这个例子中,我们打开一个名为example.csvCSV文件,之后创建了一个名为reader的读取器对象。在for循环中,程序遍历了CSV文件中的每一行,通过print函数打印出了每一行的所有元素。 另一种常见的方法是使用pandas模块来读取和处理CSV文件。pandas是一个强大的数据分析工具,可以轻松地读取CSV文件进行数据清洗和数据分析。例如: import pandas as pd data = pd.read_csv('example.csv') print(data) 在这个示例中,我们使用pandas的read_csv()函数读取了example.csv的数据,并将其存储在名为data的数据框中。使用print函数打印data,则输出CSV文件中的所有元素。 总之,通过csv模块和pandas模块,我们可以轻松地读取CSV文件并调用元素。这为我们的数据处理和分析提供了强大的工具。 ### 回答3: CSV文件是一种常见的文件格式,它通常用于存储大量结构化数据。在Python中,我们可以使用csv模块来读取CSV文件。下面我们就来介绍如何读取CSV文件并调用元素。 首先,我们需要使用csv模块中的reader()函数打开CSV文件,并创建一个reader对象。这个对象可以让我们逐行读取CSV文件中的数据。例如,我们假设我们有一个名为data.csvCSV文件,其中包含以下数据: Name, Age, Gender Tom, 26, Male Susan, 30, Female John, 40, Male 使用以下代码可以打开这个文件,并创建一个reader对象: ```python import csv with open('data.csv', 'r') as file: reader = csv.reader(file) 在上面的代码中,我们用with语句打开了data.csv文件,并将文件流传递给csv.reader()函数来创建一个reader对象。 现在,我们可以使用for循环逐行读取CSV文件中的数据。例如,下面的代码可以打印出CSV文件中每一行的内容: ```python import csv with open('data.csv', 'r') as file: reader = csv.reader(file) for row in reader: print(row) 在上面的代码中,我们遍历了reader对象,并打印出每一行的内容。运行结果如下: ['Name', ' Age', ' Gender'] ['Tom', ' 26', ' Male'] ['Susan', ' 30', ' Female'] ['John', ' 40', ' Male'] 我们可以看到,每一行的内容都被存储为一个列表。列表的每个元素代表CSV文件中的一个单元格。 我们还可以使用下标来访问特定的单元格。例如,下面的代码可以打印出CSV文件中第二行第一个单元格的内容: ```python import csv with open('data.csv', 'r') as file: reader = csv.reader(file) for i, row in enumerate(reader): if i == 1: print(row[0]) 在上面的代码中,我们使用enumerate()函数来遍历reader对象,并使用if语句来控制输出。当i等于1时,打印出第二行的第一个单元格的内容。运行结果为Tom。 总结来说,读取CSV文件并调用元素是一个非常基本的操作。我们只需要使用csv模块中的reader()函数来创建一个reader对象,然后使用for循环来遍历这个对象并获取单元格的内容即可。同时,我们还可以使用下标来访问特定的单元格。