• 一个操作cvs格式的c++类


    经常需要使用excel,或者把有的数据用excel打开,程序可以生成cvs格式的文件,这样就可以excel打开并处理了,于是找了一个处理cvs的c++类跟大家分享

    代码出处找不到了:

    代码如下:

    StringParser.h

    #pragma once
    #include <process.h>
    #include <Windows.h>
    #include <map>
    #include <vector>
    #include <queue>
    #include <set>
    #include <string>
    #include <list>
    
    typedef char                    i8;
    typedef unsigned char           u8;
    typedef short                  i16;
    typedef unsigned short          u16;
    typedef long int                i32;
    typedef unsigned long           u32;
    
    
    
    namespace StringParser{
    
    
    
    
    
    
    
    //从分隔符中获得数据
    inline int GetParamFromString(std::string Str, std::vector<i32>& IntVec, char Delim = ',')
    {
        char* p = strtok((char*)Str.c_str(), &Delim); 
        while (p)
        {
            IntVec.push_back(atoi(p));
            p = strtok(NULL, &Delim); 
        }
        return IntVec.size();
    }
    
    inline int GetParamFromString(std::string Str, std::vector<float>& FloatVec, char Delim = ',')
    {
        char* p = strtok((char*)Str.c_str(), &Delim); 
        while (p)
        {
            FloatVec.push_back(atof(p));
            p = strtok(NULL, &Delim); 
        }
        return FloatVec.size();
    }
    
    inline int GetParamFromString(std::string Str, std::vector<u32>& uiIntVec, char Delim = ',')
    {
        char* p = strtok((char*)Str.c_str(), &Delim); 
        while (p)
        {
            uiIntVec.push_back(strtoul(p, NULL, 10));
            p = strtok(NULL, &Delim); 
        }
        return uiIntVec.size();
    }
    
    inline int GetParamFromString(std::string Str, std::vector<std::string>& StringVec, char Delim = ',')
    {
        char* p = strtok((char*)Str.c_str(), &Delim); 
        while (p)
        {
            std::string buffer = p;
            StringVec.push_back(buffer);
            p = strtok(NULL, &Delim); 
        }
        return StringVec.size();
    }
    
    //以左右符号得到括号中的数据ex:[3.1415;0.125][1000;9999]
    template<typename T>
    int GetParamFromArea(std::string Str, std::vector<std::vector<T> >& IntVec, char left = '[', char right = ']', char Delim = ';')
    {
        char* pTarget = (char*)Str.c_str();
        for (;;)
        {
            char* pLeft = strchr(pTarget, left);
            char* pRight = strchr(pTarget, right);
            if (pLeft && pRight)
            {
                std::string strbuff;
                strbuff.insert(0, ++pLeft, pRight-pLeft);
    
                std::vector<T> Intbuff;
                if (GetParamFromString(strbuff, Intbuff, Delim))
                {
                    IntVec.push_back(Intbuff);
                }
                pTarget = ++pRight;
            }
            else
            {
                break;
            }
        }
        return IntVec.size();
    }
    
    
    
    
    
    
    
    
    
    };


    CCSVOperator.h

    #pragma once
    #include "StringParser.h"
    
    
    
    class CCSVOperator
    {
    
    public:
        CCSVOperator(){};
        ~CCSVOperator(){};
        CCSVOperator(const char* path);
    
    
        bool LoadCSV(const char* path);
        bool SaveCSV(const char* path = NULL);
    
        bool GetInt(u32 uiLine, u32 uiRow, int& iValue);
        bool GetFloat(u32 uiLine, u32 uiRow, float& fValue);
        std::string* GetString(u32 uiLine, u32 uiRow);
        bool SetNumber(u32 uiLine, u32 uiRow, int iValue);
        bool SetNumber(u32 uiLine, u32 uiRow, float fValue);
        bool SetString(u32 uiLine, u32 uiRow, const char* pStr);
        std::map<u32, std::map<u32, std::string> >& GetCSVMap(){return m_StringKeyMap;}
    
    protected:
        std::string m_CSVName;
        std::map<u32, std::map<u32, std::string> > m_StringKeyMap;
    public:
    	int indexOfLines;	//行数
    	int indexOfColumn;	//列数,有可能出现列长不一样的情况
    
    };
    
    


     

    CSVOperator.cpp

    #include "CSVOperator.h"
    
    
    //////////////////////////////////////////////////////////////////////////
    //CSV operator
    
    CCSVOperator::CCSVOperator(const char* path)
    {
        LoadCSV(path);
    }
    
    bool CCSVOperator::LoadCSV(const char* path)
    {
    	 indexOfLines = 0;	
    	 indexOfColumn = 0;
        FILE* pfile = fopen(path, "r");
        if (pfile)
        {
            fseek(pfile,0,SEEK_END);
            u32 dwsize = ftell(pfile);
            rewind(pfile);// 指针回到文件开头
    
            char* filebuffer = new char[dwsize];
            fread(filebuffer, 1, dwsize, pfile);
    
            std::map<u32, std::string> StringMap;
            char* pBegin = filebuffer;
            char* pEnd = strchr(filebuffer, '
    ');//查找换行首次出现的位置
            u32 uiIndex = 1;
            while (pEnd != NULL)
            {
                std::string strbuff;
                strbuff.insert(0, pBegin, pEnd-pBegin);
                if (!strbuff.empty())
                {
                    StringMap[uiIndex] = strbuff;
                }
                pBegin = pEnd + 1;
                pEnd = strchr(pEnd + 1, '
    ');
                ++uiIndex;
            }
    
    		indexOfLines = uiIndex - 1;
    
            delete[] filebuffer;
    
            std::map<u32, std::string>::iterator iter = StringMap.begin();
            for (; iter != StringMap.end(); ++iter)
            {
                std::vector<std::string> StringVec;
                std::map<u32, std::string> l_StringMap;
                StringParser::GetParamFromString(iter->second, StringVec);
    
    			if (indexOfColumn< StringVec.size())
    			{
    				indexOfColumn = StringVec.size();//保存最大的列数
    			}
    			
                for (int i = 0; i < StringVec.size(); ++i)
                {
                    l_StringMap[i+1] = StringVec.at(i);
                }
    			
                m_StringKeyMap[iter->first] = l_StringMap;
            }
            fclose(pfile);
            m_CSVName = path;
            return true;
        }
    
        return false;
    }
    
    
    bool CCSVOperator::GetInt(u32 uiLine, u32 uiRow, int& iValue)
    {
        std::string* pKey = GetString(uiLine, uiRow);
        if (pKey)
        {
            iValue = atoi(pKey->c_str());
            return true;
        }
        else
        {
            return false;
        }
    }
    
    bool CCSVOperator::GetFloat(u32 uiLine, u32 uiRow, float& fValue)
    {
        std::string* pKey = GetString(uiLine, uiRow);
        if (pKey)
        {
            fValue = atof(pKey->c_str());
            return true;
        }
        else
        {
            return false;
        }
    }
    
    std::string* CCSVOperator::GetString(u32 uiLine, u32 uiRow)
    {
        std::map<u32, std::map<u32, std::string> >::iterator iterLine = m_StringKeyMap.find(uiLine);
        if (iterLine != m_StringKeyMap.end())
        {
            std::map<u32, std::string>& rStringMap = iterLine->second;
            std::map<u32, std::string>::iterator iterRow = rStringMap.find(uiRow);
            if (iterRow != rStringMap.end())
            {
                return &iterRow->second;
            }
            else
            {
                return NULL;
            }
        }
        else
        {
            return NULL;
        }
    }
    
    bool CCSVOperator::SetNumber(u32 uiLine, u32 uiRow, int iValue)
    {
        std::string* pKey = GetString(uiLine, uiRow);
        if (pKey)
        {
            char buffer[100];
            memset(buffer, 0, sizeof(buffer));
            sprintf(buffer, "%d", iValue);
            pKey->clear();
            *pKey = buffer;
            return true;
        }
        else
        {
            return false;
        }
    }
    
    bool CCSVOperator::SetNumber(u32 uiLine, u32 uiRow, float fValue)
    {
        std::string* pKey = GetString(uiLine, uiRow);
        if (pKey)
        {
            char buffer[100];
            memset(buffer, 0, sizeof(buffer));
            sprintf(buffer, "%d", fValue);
            pKey->clear();
            *pKey = buffer;
            return true;
        }
        else
        {
            return false;
        }
    }
    
    bool CCSVOperator::SetString(u32 uiLine, u32 uiRow, const char* pStr)
    {
        std::string* pKey = GetString(uiLine, uiRow);
        if (pKey)
        {
            pKey->clear();
            *pKey = pStr;
            return true;
        }
        else
        {
            return false;
        }
    }
    
    bool CCSVOperator::SaveCSV(const char* path)
    {
        if (path != NULL)
        {
            m_CSVName = path;
        }
    
        FILE* pfile = fopen(m_CSVName.c_str(), "w");
        if (pfile)
        {
            std::map<u32, std::map<u32, std::string> >::iterator iter = m_StringKeyMap.begin();
            for (; iter != m_StringKeyMap.end(); ++iter)
            {
                std::map<u32, std::string>& rStringMap = iter->second;
                std::map<u32, std::string>::iterator it = rStringMap.begin();
                for (; it != rStringMap.end(); ++it)
                {
                    std::string key = it->second;
                    key += ',';
                    fwrite(key.c_str(), 1, key.size(), pfile);
                }
                char Delim = '
    ';
                fwrite(&Delim, 1, 1, pfile);
            }
            fclose(pfile);
        }
        else
        {
            return false;
        }
    
        return true;
    }


     

    CVS_OP.CPP

    // CSV_OP.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include "CSVOperator.h"
    #include <iostream>
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    
        CCSVOperator CSVOperator;
        CSVOperator.LoadCSV("画图数据.csv");
    
    	cout<<"line:  "<<CSVOperator.indexOfLines<<endl;
    	cout<<"column:  "<<CSVOperator.indexOfColumn<<endl;
    
        std::string* pString = CSVOperator.GetString(1,600);
        if (pString)
        {
            std::cout<< pString->c_str() << '
    ';
        }
    
        pString = CSVOperator.GetString(2,4);
        if (pString)
        {
            std::cout<< pString->c_str() << '
    ';
        }
    
    	//std::string* pString = NULL;
    	int j = 0;
    	for (int i = 0,nColConut = CSVOperator.indexOfColumn;i < nColConut ; ++i)
    	{
    		if(pString = CSVOperator.GetString(1,i+1))
    		{
    			//m_listctrl.InsertColumn(j ,pString->c_str(), LVCFMT_CENTER, 50);  // 添加第1列,
    			//cout<<"	"<<&pString;
    			cout<<"	";
    			printf(pString->c_str());
    			++j;
    		}
    	}
    
        
    //     int _int = 0;
    //     if (CSVOperator.GetInt(3,1,_int))
    //     {
    //         std::cout<< _int <<'
    ';
    //     }
    // 
         float _float = 0.0f;
         if (CSVOperator.GetFloat(4,1, _float))
        {
            std::cout<< _float<<'
    ';
         }
    
    
        system("pause");
    	return 0;
    }
    
    


    效果如下:

  • 相关阅读:
    jquery通过live绑定toggle事件
    svn is already locked解决方案
    不安全代码只会在使用 /unsafe 编译的情况下出现
    eclipse 新建 java 文件时自动生成注释
    浅谈权限设计
    ie6/IE8/IE9/谷歌以及火狐等浏览器下li 高度一致解决办法
    PHP+MSSQL TEXT字段被截断的解决方案
    利用CSS让dl dt dd呈现多行多列效果
    CSS实现图片水平垂直居中于DIV
    CSS 关于IE6 margin 为负数 负值的时候 正常显示的方法
  • 原文地址:https://www.cnblogs.com/wuyida/p/6301380.html
Copyright © 2020-2023  润新知