CSVEditor

    技术2024-12-19  7

    #ifndef __CSVEDITOR_H__#define __CSVEDITOR_H__

    #pragma warning(disable : 4786)#include <string>#include <vector>

    using namespace std;

    class CSVEditor{public:  /*  使用的时候必须设置列数 */ explicit CSVEditor(int iRow = 10);

     /*  添加一行数据 */ int AddOneLine( string & strInfo, const string & strSplict);

     /*  修改指定行列的一个字符(行,列都是从 0 开始) */ int ModifySpecfyData(int iLine, int iRow, const string & strdata);

     /*  数据保存到文件 */ int SaveToFile(const char * pszFilePath);

     /*  返回列数 */ int GetRows(void) {  return m_iRows; }

     /*  返回行数 */ int GetLines(void) {  return m_iLines; }

    private:

     void ReplaseSpecifyString(string & strSource, const string & strFind, const string & strReplase);  void ModifySpecifyString(string & strSource, const string & strFind, const string & strSplict);

     int    m_iLines;    int    m_iRows; vector<string> m_vec;};

    #endif

     

     

    //

    #include "CSVEditor.h"

    const char gszSplict[] = {"#*#"};  // 私有字符串分隔符const char gsChangeLine[] = "/n";

    CSVEditor::CSVEditor(int iRow /* = 10 */){ m_iRows = iRow;}

    int CSVEditor::AddOneLine(string & strInfo, const string & strSplict){ string::size_type Pos = 0; string::size_type BackPos = Pos;

     ModifySpecifyString(strInfo,",", strSplict); //处理原始 , 号

     int iOffset = strSplict.length(); int iAddLen = strlen(gszSplict); int iCount = 1; bool bNeedDel = true;

     while (iCount < m_iRows) {  Pos = strInfo.find(strSplict, BackPos);  iCount++;  if ( string::npos != Pos )  {   strInfo.erase(Pos, iOffset);   strInfo.insert(Pos, gszSplict);   BackPos = Pos;   BackPos+= iAddLen;  }  else  {   //数据不够,剩余的填空   strInfo.insert(strInfo.length(),gszSplict);   bNeedDel = false;  } }

     if ((string::npos != BackPos) && bNeedDel) {  Pos = strInfo.find(strSplict, BackPos);

      if (string::npos != Pos)  {   //删除多余数据   int iEraseLen = strInfo.length() - Pos;   strInfo.erase(Pos, iEraseLen);  } }

     m_vec.push_back(strInfo); return 0;

    }

    int CSVEditor::ModifySpecfyData(int iLine, int iRow, const string & strdata){ if ((iLine < m_iLines) && (iRow < m_iRows)) {  vector<string>::iterator iter = m_vec.begin();  vector<string>::iterator iternext = m_vec.end();  iter += iLine;

      string strOrg = *iter;  string::size_type Pos = 0;  string::size_type BackPos = Pos;    int iCount = 0;  //将第0个元素当做第1个对象  int iOffset = strlen(gszSplict);

      while ((string::npos != Pos) && (iCount < iRow))  {   Pos = strOrg.find(gszSplict, BackPos);   BackPos = Pos;   BackPos += iOffset;   iCount++;  }

      int iLen = 0;

      string::size_type EndPos = strOrg.find(gszSplict, BackPos);  if( string::npos != EndPos )  {   iLen = EndPos - BackPos;  }  else  {   iLen = strOrg.length() - BackPos;  }    strOrg.replace(BackPos, iLen, strdata);

      return 0; } return -1;}

    int CSVEditor::SaveToFile(const char * pszFilePath){ FILE *fe  = fopen(pszFilePath, "wt"); if (NULL == fe) {  return -1; }

     string strTmp; vector<string>::iterator iter = m_vec.begin(); while(iter != m_vec.end()) {  strTmp = *iter;  ReplaseSpecifyString(strTmp,gszSplict,",");  strTmp += gsChangeLine; //换行  fwrite(strTmp.c_str(), strTmp.length(),1, fe);  iter++;

     }

     fclose(fe); return 0;}

    void CSVEditor::ReplaseSpecifyString(string & strSource, const string & strFind, const string & strReplase){ string::size_type npos = 0; int iReplaseLen = strFind.length(); int iOffset = strReplase.length();

     while (1) {  npos = strSource.find(strFind, npos);

      if (string::npos != npos)  {   strSource.replace(npos,iReplaseLen, strReplase);   npos += iOffset;  }  else  {   break;  }  }

    }

    void CSVEditor::ModifySpecifyString(string & strSource, const string & strFind, const string & strSplict){ if (strSplict.empty()) {  //单个字符  string::size_type pos = strSource.find(strFind);  if (string::npos != pos)  {   strSource.insert(0,"/"");   strSource.insert(strSource.length(), "/"");  }

     } else {  string::size_type start = 0;  string::size_type lastEnd = start;  string::size_type Pos = start;   // ,的位置  int iOffset = strSplict.length();  bool bLastCompare = false;

      while(1)  {   start = strSource.find(strSplict, lastEnd);

       if (string::npos == start)   {    start = strSource.length();    bLastCompare = true;   // break;   }   

       //检测是否有,存在   Pos = strSource.find(strFind, lastEnd);   if (string::npos == Pos)   {    //之后的字符串中没有,需要检测的字符串,直接结束对比    break;   }   else   {        //检测位置是否在当前的查找范围内,如果在该范围则处理,否则进行下一轮对比    if (Pos <= start)    {     strSource.insert(start, "/""); //先加尾巴后加前     strSource.insert(lastEnd, "/"");    }    lastEnd = start;    lastEnd += iOffset;    lastEnd += 2;

       }

       if (bLastCompare)   {    //完成了所有的查找对比,退出    break;   }

     

      } }}

    最新回复(0)