STL的CSVEditor

来源:互联网 发布:程序员常用英语词汇 编辑:程序博客网 时间:2024/05/16 17:47


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

原创粉丝点击