#ifndef __CSVEDITOR_H__#define __CSVEDITOR_H__
#include <string>#include <vector>
using namespace std;
class CSVEditor{public: /* 构造函数 */ CSVEditor();
/* 析构函数 */ ~CSVEditor();
/* 函数功能: 设置输出的列数。(该值可以是一个比预期大的值) 输入: iColume 需要设置的列数
*/ void SetColume(unsigned int iColume);
/* 函数功能: 返回当前的列数 输入: NA 返回: 当前的列数 */ int GetColume(void);
/* 函数功能: 向CSVEditor尾部添加一行数据。 输入: strAdd 需要添加的数据 strDiv 分割符(可以是字符串) 返回: 当前的行号。(既已经存储了多少条数据) */ int AddOneLineToTail(string & strAdd, string & strDiv);
/* 函数功能: 向CSVEditor尾部添加一行数据 输入: pszAdd 需要添加的数据, pszDiv 分隔符。(可以是字符串)
*/ int AddOneLineToTail(const char *pszAdd, const char *pszDiv);
/* 函数功能: 向CSVEditor头部添加一行数据。 输入: strAdd 需要添加的数据 strDiv 分割符(可以是字符串) 返回: 当前的行号。(既已经存储了多少条数据) */ int AddOneLineToHead(string & strAdd, string & strDiv);
/* 函数功能: 向CSVEditor头部添加一行数据 输入: pszAdd 需要添加的数据, pszDiv 分隔符。(可以是字符串) */ int AddOneLineToHead(const char * pszAdd, const char * pszDiv);
/* 函数功能: 修改指定行的数据 输入: iLine 需要修改的行数,strModify 需要修改为的数据,strDiv分隔符 返回: 当前的总行数.(如果iLine比当前的行数大,则按添加操作进行) */ int ModifyOneLine(unsigned int iLine, string & strModify, string & strDiv);
/* 函数功能: 删除所有条目 输入: NA 返回: NA */ void ClearAll(void);
/* 函数功能: 删除指定行的数据 输入: iLine 需要删除的行号。(该行号在 AddOneLine返回,从1开始) 返回: 当前还剩余的条目数 */ int DeleteOneLine(unsigned int iLine);
/* 函数功能: 保存当前数据。 输入: strPath 需要存储文件的绝对路径,后缀名必须是.csv否则将自动添加 (这里需要保证该路径是有效路径,否则可能存储失败) 返回: 0 保存失败,其它保存成功 */ int SaveToFile(string & strPath);
private:
/* 函数功能: 向容器添加一行数据。(默认添加到尾部) 输入: strAdd 需要添加的数据 strDiv 分隔符, bHead 添加到头部 返回: 当前的条目数。 */ int AddOneLine( string & strAdd, string & strDiv, bool bHead = false);
/* 函数功能: 将当前数据添加到指定行 输入: iLine 需要添加到的行数 strAdd 需要添加的数据 strDiv 分隔符, bHead 添加到头部 返回: 当前的条目数。
*/ int AddOneLine( string & strAdd, string & strDiv ,bool bHead = false, int iLine=0 )
/* 函数功能: 在输出前修正当前的数据信息。 (如果没有调用 SetColume 接口,则按照输入数据中最长的条目作为列数) */ void ModifyCurrentData(void);private: unsigned int m_iColume; vector< vector<string> > m_vv_Counter; //用来保存数据的容器};
#endif
//
#include "CSVEditor.h"
CSVEditor::CSVEditor(){ }
CSVEditor::~CSVEditor(){ ClearAll();}
void CSVEditor::SetColume(unsigned int iColume){ m_iColume = iColume;}
int CSVEditor::GetColume(void){ return m_iColume;}
int CSVEditor::AddOneLineToHead(string & strAdd, string & strDiv){ return AddOneLine(strAdd, strDiv, true);}
int CSVEditor::AddOneLineToHead(const char * pszAdd, const char * pszDiv){ string strAdd(pszAdd); string strDiv(strDiv);
return AddOneLineToHead(strAdd, strDiv);}
int CSVEditor::AddOneLineToTail(const char *pszAdd, const char *pszDiv){ string strAdd(pszAdd); string strDiv(pszDiv);
return AddOneLineToTail(strAdd, strDiv);}
int CSVEditor::AddOneLineToTail(string & strAdd, string & strDiv){ return AddOneLine(strAdd, strDiv, false);}
int CSVEditor::AddOneLine(string & strAdd, string & strDiv ,bool bHead /*= false*/, int iLine/*=0*/ ){
vector<string> vec_tmp; //用来记录一行数据的容器 string strtmp; //用来保存一个单元格数据
string::size_type iLast = 0; string::size_type iCurrent = 0;
iCurrent = strAdd.find(strDiv, iLast);
while ( string::npos != iCurrent) { strtmp = strAdd.substr(iLast, iCurrent - iLast); vec_tmp.push_back(strtmp); iLast = iCurrent; iLast += strDiv.length(); //跳过分隔符 iCurrent = strAdd.find(strDiv, iLast); }
if (string::npos != iLast) { iLast += strDiv.length(); //跳过分隔符 strtmp = strAdd.substr(iLast); //不需要传入长度, } if (0 != iLine) { int i = 1; vector< vector<string> >::iterator iter = m_vv_Counter.begin(); while (i < iLine) { iter++; i++; } m_vv_Counter.insert(iter, vec_tmp); } else { if (bHead) { m_vv_Counter.insert(m_vv_Counter.begin(), vec_tmp); //添加到头部 } else { m_vv_Counter.push_back(vec_tmp); //添加到尾部 } }
return m_vv_Counter.szie(); }
int CSVEditor::ModifyOneLine(unsigned int iLine, string & strModify, string & strDiv){ /* 首先检测是否是执行插入操作 */ if (m_iColume < iLine) { return AddOneLine(strModify, strDiv, false); //将数据添加到尾部 } else { /* 删除旧数据 */ }}
int CSVEditor::DeleteOneLine(unsigned int iLine){ int i = 1; vector< vector<string> >::iterator iter = m_vv_Counter.begin();
while ((i < iLine) && (iter != m_vv_Counter.end())) { i++; iter++; }
if (iter != m_vv_Counter.end()) { m_vv_Counter.erase(iter); }
return m_vv_Counter.size();}
void CSVEditor::ClearAll(){ m_vv_Counter.clear();}
int CSVEditor::SaveToFile(string & strPath){
return 0;}