经常需要使用excel,或者把有的数据用excel打开,程序可以生成cvs格式的文件,这样就可以excel打开并处理了,于是找了一个处理cvs的c++类跟大家分享

代码出处找不到了:

代码如下:

StringParser.h

#pragma once
#include <process.h>
#include <Windows.h>
#include <map>
#include <vector>
#include <queue>
#include <set>
#include <string>
#include <list> typedef char i8;
typedef unsigned char u8;
typedef short i16;
typedef unsigned short u16;
typedef long int i32;
typedef unsigned long u32; namespace StringParser{ //从分隔符中获得数据
inline int GetParamFromString(std::string Str, std::vector<i32>& IntVec, char Delim = ',')
{
char* p = strtok((char*)Str.c_str(), &Delim);
while (p)
{
IntVec.push_back(atoi(p));
p = strtok(NULL, &Delim);
}
return IntVec.size();
} inline int GetParamFromString(std::string Str, std::vector<float>& FloatVec, char Delim = ',')
{
char* p = strtok((char*)Str.c_str(), &Delim);
while (p)
{
FloatVec.push_back(atof(p));
p = strtok(NULL, &Delim);
}
return FloatVec.size();
} inline int GetParamFromString(std::string Str, std::vector<u32>& uiIntVec, char Delim = ',')
{
char* p = strtok((char*)Str.c_str(), &Delim);
while (p)
{
uiIntVec.push_back(strtoul(p, NULL, 10));
p = strtok(NULL, &Delim);
}
return uiIntVec.size();
} inline int GetParamFromString(std::string Str, std::vector<std::string>& StringVec, char Delim = ',')
{
char* p = strtok((char*)Str.c_str(), &Delim);
while (p)
{
std::string buffer = p;
StringVec.push_back(buffer);
p = strtok(NULL, &Delim);
}
return StringVec.size();
} //以左右符号得到括号中的数据ex:[3.1415;0.125][1000;9999]
template<typename T>
int GetParamFromArea(std::string Str, std::vector<std::vector<T> >& IntVec, char left = '[', char right = ']', char Delim = ';')
{
char* pTarget = (char*)Str.c_str();
for (;;)
{
char* pLeft = strchr(pTarget, left);
char* pRight = strchr(pTarget, right);
if (pLeft && pRight)
{
std::string strbuff;
strbuff.insert(0, ++pLeft, pRight-pLeft); std::vector<T> Intbuff;
if (GetParamFromString(strbuff, Intbuff, Delim))
{
IntVec.push_back(Intbuff);
}
pTarget = ++pRight;
}
else
{
break;
}
}
return IntVec.size();
} };

CCSVOperator.h

#pragma once
#include "StringParser.h" class CCSVOperator
{ public:
CCSVOperator(){};
~CCSVOperator(){};
CCSVOperator(const char* path); bool LoadCSV(const char* path);
bool SaveCSV(const char* path = NULL); bool GetInt(u32 uiLine, u32 uiRow, int& iValue);
bool GetFloat(u32 uiLine, u32 uiRow, float& fValue);
std::string* GetString(u32 uiLine, u32 uiRow);
bool SetNumber(u32 uiLine, u32 uiRow, int iValue);
bool SetNumber(u32 uiLine, u32 uiRow, float fValue);
bool SetString(u32 uiLine, u32 uiRow, const char* pStr);
std::map<u32, std::map<u32, std::string> >& GetCSVMap(){return m_StringKeyMap;} protected:
std::string m_CSVName;
std::map<u32, std::map<u32, std::string> > m_StringKeyMap;
public:
int indexOfLines; //行数
int indexOfColumn; //列数,有可能出现列长不一样的情况 };

CSVOperator.cpp

#include "CSVOperator.h"

//////////////////////////////////////////////////////////////////////////
//CSV operator CCSVOperator::CCSVOperator(const char* path)
{
LoadCSV(path);
} bool CCSVOperator::LoadCSV(const char* path)
{
indexOfLines = 0;
indexOfColumn = 0;
FILE* pfile = fopen(path, "r");
if (pfile)
{
fseek(pfile,0,SEEK_END);
u32 dwsize = ftell(pfile);
rewind(pfile);// 指针回到文件开头 char* filebuffer = new char[dwsize];
fread(filebuffer, 1, dwsize, pfile); std::map<u32, std::string> StringMap;
char* pBegin = filebuffer;
char* pEnd = strchr(filebuffer, '\n');//查找换行首次出现的位置
u32 uiIndex = 1;
while (pEnd != NULL)
{
std::string strbuff;
strbuff.insert(0, pBegin, pEnd-pBegin);
if (!strbuff.empty())
{
StringMap[uiIndex] = strbuff;
}
pBegin = pEnd + 1;
pEnd = strchr(pEnd + 1, '\n');
++uiIndex;
} indexOfLines = uiIndex - 1; delete[] filebuffer; std::map<u32, std::string>::iterator iter = StringMap.begin();
for (; iter != StringMap.end(); ++iter)
{
std::vector<std::string> StringVec;
std::map<u32, std::string> l_StringMap;
StringParser::GetParamFromString(iter->second, StringVec); if (indexOfColumn< StringVec.size())
{
indexOfColumn = StringVec.size();//保存最大的列数
} for (int i = 0; i < StringVec.size(); ++i)
{
l_StringMap[i+1] = StringVec.at(i);
} m_StringKeyMap[iter->first] = l_StringMap;
}
fclose(pfile);
m_CSVName = path;
return true;
} return false;
} bool CCSVOperator::GetInt(u32 uiLine, u32 uiRow, int& iValue)
{
std::string* pKey = GetString(uiLine, uiRow);
if (pKey)
{
iValue = atoi(pKey->c_str());
return true;
}
else
{
return false;
}
} bool CCSVOperator::GetFloat(u32 uiLine, u32 uiRow, float& fValue)
{
std::string* pKey = GetString(uiLine, uiRow);
if (pKey)
{
fValue = atof(pKey->c_str());
return true;
}
else
{
return false;
}
} std::string* CCSVOperator::GetString(u32 uiLine, u32 uiRow)
{
std::map<u32, std::map<u32, std::string> >::iterator iterLine = m_StringKeyMap.find(uiLine);
if (iterLine != m_StringKeyMap.end())
{
std::map<u32, std::string>& rStringMap = iterLine->second;
std::map<u32, std::string>::iterator iterRow = rStringMap.find(uiRow);
if (iterRow != rStringMap.end())
{
return &iterRow->second;
}
else
{
return NULL;
}
}
else
{
return NULL;
}
} bool CCSVOperator::SetNumber(u32 uiLine, u32 uiRow, int iValue)
{
std::string* pKey = GetString(uiLine, uiRow);
if (pKey)
{
char buffer[100];
memset(buffer, 0, sizeof(buffer));
sprintf(buffer, "%d", iValue);
pKey->clear();
*pKey = buffer;
return true;
}
else
{
return false;
}
} bool CCSVOperator::SetNumber(u32 uiLine, u32 uiRow, float fValue)
{
std::string* pKey = GetString(uiLine, uiRow);
if (pKey)
{
char buffer[100];
memset(buffer, 0, sizeof(buffer));
sprintf(buffer, "%d", fValue);
pKey->clear();
*pKey = buffer;
return true;
}
else
{
return false;
}
} bool CCSVOperator::SetString(u32 uiLine, u32 uiRow, const char* pStr)
{
std::string* pKey = GetString(uiLine, uiRow);
if (pKey)
{
pKey->clear();
*pKey = pStr;
return true;
}
else
{
return false;
}
} bool CCSVOperator::SaveCSV(const char* path)
{
if (path != NULL)
{
m_CSVName = path;
} FILE* pfile = fopen(m_CSVName.c_str(), "w");
if (pfile)
{
std::map<u32, std::map<u32, std::string> >::iterator iter = m_StringKeyMap.begin();
for (; iter != m_StringKeyMap.end(); ++iter)
{
std::map<u32, std::string>& rStringMap = iter->second;
std::map<u32, std::string>::iterator it = rStringMap.begin();
for (; it != rStringMap.end(); ++it)
{
std::string key = it->second;
key += ',';
fwrite(key.c_str(), 1, key.size(), pfile);
}
char Delim = '\n';
fwrite(&Delim, 1, 1, pfile);
}
fclose(pfile);
}
else
{
return false;
} return true;
}

CVS_OP.CPP

// CSV_OP.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include "CSVOperator.h"
#include <iostream>
using namespace std; int _tmain(int argc, _TCHAR* argv[])
{ CCSVOperator CSVOperator;
CSVOperator.LoadCSV("画图数据.csv"); cout<<"line: "<<CSVOperator.indexOfLines<<endl;
cout<<"column: "<<CSVOperator.indexOfColumn<<endl; std::string* pString = CSVOperator.GetString(1,600);
if (pString)
{
std::cout<< pString->c_str() << '\n';
} pString = CSVOperator.GetString(2,4);
if (pString)
{
std::cout<< pString->c_str() << '\n';
} //std::string* pString = NULL;
int j = 0;
for (int i = 0,nColConut = CSVOperator.indexOfColumn;i < nColConut ; ++i)
{
if(pString = CSVOperator.GetString(1,i+1))
{
//m_listctrl.InsertColumn(j ,pString->c_str(), LVCFMT_CENTER, 50); // 添加第1列,
//cout<<"\t"<<&pString;
cout<<"\t";
printf(pString->c_str());
++j;
}
} // int _int = 0;
// if (CSVOperator.GetInt(3,1,_int))
// {
// std::cout<< _int <<'\n';
// }
//
float _float = 0.0f;
if (CSVOperator.GetFloat(4,1, _float))
{
std::cout<< _float<<'\n';
} system("pause");
return 0;
}

效果如下:

一个操作cvs格式的c++类的更多相关文章

  1. C#操作Xml树的扩展类

    本文提供一个操作Xml树的扩展类,与将xml字符串直接映射成实体对象的使用方法,供大家参考,学习. 下面附上源码 using System; using System.Collections.Gene ...

  2. 用CIL写程序:定义一个叫“慕容小匹夫”的类

    前文回顾: <用CIL写程序:你好,沃尔德> <用CIL写程序:写个函数做加法> 前言: 今天是乙未羊年的第一天,小匹夫先在这里给各位看官拜个年了.不知道各位看官是否和匹夫一样 ...

  3. C# DbHelperSQL,操作不同的数据库帮助类 (转载)

    本类主要是用来访问Sql数据库而编写的主要功能如下 .数据访问基础类(基于SQ),主要是用来访问SQ数据库的. .得到最大值:是否存在:是否存在(基于SQParameter): . 执行SQL语句,返 ...

  4. C# DbHelperSQLP,操作不同的数据库帮助类 (转载)

    本类主要是用来访问不同数据库而编写的主要功能如下 .数据访问基础类(基于不同数据库),主要是用来访问不同数据库的. .得到最大值:是否存在:是否存在: . 执行SQL和Orace语句,返回影响的记录数 ...

  5. 用 python 来操作 docx, xlsx 格式文件(二)(使用 docx 库操作 docx 格式文件

    docx 库 文章结构: 一.docx 基本用,创建 docx 文件并添加数据 二.深入理解文本格式(format),并设置所格式属性(attribute) 三.深入理解样式(styles),以及如何 ...

  6. C#字符串数组排序 C#排序算法大全 C#字符串比较方法 一个.NET通用JSON解析/构建类的实现(c#) C#处理Json文件 asp.net使用Jquery+iframe传值问题

    C#字符串数组排序   //排序只带字符的数组,不带数字的 private   string[]   aa   ={ "a ", "c ", "b & ...

  7. 一个比CBitmap更优秀的类 -- CImage类

    Visual C++的CBitmap类的功能是比较弱的,它只能显示出在资源中的图标.位图.光标以及图元文件的内容,而不像VB中的Image控件可以显示出绝大多数的外部图像文件(BMP.GIF.JPEG ...

  8. java自学第4期——:Scanner类、匿名对象介绍、Random类、ArrayList集合、标准类格式、String类、static静态、Arrays工具类、Math类(1)

    一.Scanner类 1.api简介: 应用程序编程接口 2.Scanner类: 作用:获取键盘输入的数据 位置: java.util.Scanner. 使用:使用成员方法nextInt() 和 ne ...

  9. Java操作文件夹的工具类

    Java操作文件夹的工具类 import java.io.File; public class DeleteDirectory { /** * 删除单个文件 * @param fileName 要删除 ...

随机推荐

  1. Android图表库MPAndroidChart(九)——神神秘秘的散点图

    Android图表库MPAndroidChart(九)--神神秘秘的散点图 今天所的散点图可能用的人不多,但是也算是图表界的一股清流,我们来看下实际的效果 添加的数据有点少,但是足以表示散点图了,我们 ...

  2. Python 通过继承实现标准对象的子类

    idict是dict的子类,它的键值和属性是同步的,并且有强大的默认值机制. 例如,假设x是idict的一个实例,且x['a']['b']=12,则有x.a.b=12.反之亦然; 假设'c'不在x的键 ...

  3. Android必知必会-长按返回健退出

    背景 平常比较常见的都是一定时间间隔内按两次返回键来退出应用,并且第一次点击会有相应的提示,网上资料比较多,这里写一下,长按返回键退出. 实现 实现的方案常用的有两个: 重写dispatchKeyEv ...

  4. RxJava操作符(08-条件和布尔操作)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51671826 本文出自:[openXu的博客] 目录: All Amb Contains D ...

  5. Android 在 SElinux下 如何获得对一个内核节点的访问权限

    点击打开链接 Android 5.0下,因为采取了SEAndroid/SElinux的安全机制,即使拥有root权限,或者对某内核节点设置为777的权限,仍然无法在JNI层访问. 本文将以用户自定义的 ...

  6. 使用jQuery AJAX读取二进制数据

    READING BINARY DATA USING JQUERY AJAX http://www.henryalgus.com/reading-binary-files-using-jquery-aj ...

  7. iOS开发出错whose view is not in the window hierarchy!的解决

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 一个简单的单窗口App在运行时出现错误: 2016-04-07 ...

  8. windows下安装nginx (转载自:http://blog.163.com/njut_wangjian/blog/static/1657964252013327103716818/)

    1.  到nginx官网上下载相应的安装包,http://nginx.org/en/download.html:下载进行解压,将解压后的文件放到自己心仪的目录下,我的解压文件放在了d盘根目录下,如下图 ...

  9. Android开发学习之路--Activity之Intent

    窗外再次飘起了小雪,还有1周就过年了,2016年即将到来,来年不知道自己将身处何处,船到桥头自然直吧.还是继续学习吧,上次学习了Activity,那么如果是两个Activity之间,怎么从一个Acti ...

  10. C语言--static修饰变量

    Static在C语言里面有两个作用,第一个是修饰变量,第二个是修饰函数. 1.Static修饰变量 按照作用范围的不同,变量分为局部变量和全局变量.如果用static修饰变量,不论这个变量是全局的还是 ...