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