STL的CSVEditor

    技术2022-05-20  34

    #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;}


    最新回复(0)