zoukankan      html  css  js  c++  java
  • csv2txt.cpp

    #include <iostream>
    #include <fstream.h>
    #include <windows.h>
    #include <iomanip.h>
    
    #pragma once
    #include <process.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;
    
    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);
        std::string* GetString(u32 uiLine, u32 uiRow);
        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;
    
    };
    
    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::CCSVOperator(const char* path)
    {
        LoadCSV(path);
    }
    
    bool CCSVOperator::LoadCSV(const char* path)
    {
        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;
            }
            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);
                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;
        }
    }
    
    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;
        }
    }
    
    int main(int argc, char* argv[])
    {
        int OtdrTestsNum;//total num of OTDR test datas
        int OtdrEventsNum;//total num of OTDR test datas
        CCSVOperator CSVOperator;
        if(!CSVOperator.LoadCSV("file.csv"))
        {
            printf("没有找到csv文档,请将csv文档放在本目录下!
    ");
            system("pause");
            return false;
        }
    
        CreateDirectory("OTDR_Test_Out",NULL);
        if( !SetCurrentDirectory("OTDR_Test_Out"))
        {
            printf("设置输出目录失败!
    ");
        }
        
        //OTDR Information
        ofstream out1("OTDR_Information.txt");
        u32 uiRow=1,uiColumn=1;
        out1<<CSVOperator.GetString(1,1)->c_str()<<": "<<CSVOperator.GetString(1,2)->c_str()<<'
    ';
        out1<<CSVOperator.GetString(2,1)->c_str()<<'
    ';
        out1<<CSVOperator.GetString(3,1)->c_str()<<"
    
    ";
        out1<<CSVOperator.GetString(4,1)->c_str()<<": "<<CSVOperator.GetString(4,2)->c_str()<<'
    ';
        for(uiRow=5;uiRow<=6;uiRow++)
        {
            for(uiColumn=1;uiColumn<=7;uiColumn++)
            {
                out1<<setiosflags(ios::left)<<setw(22)<<CSVOperator.GetString(uiRow,uiColumn)->c_str();
            }
            out1<<'
    ';
        }
        out1<<'
    '<<CSVOperator.GetString(uiRow++,1)->c_str()<<": "<<CSVOperator.GetString(uiRow,2)->c_str()<<'
    ';
        for(;uiRow<=9;uiRow++)
        {
            for(uiColumn=1;uiColumn<=3;uiColumn++)
            {
                out1<<setiosflags(ios::left)<<setw(22)<<CSVOperator.GetString(uiRow,uiColumn)->c_str();
            }
            out1<<'
    ';
        }
    
        //OTDR Test Datas
        ofstream out2("OTDR_Test_Datas.txt");
        out2<< CSVOperator.GetString(10,1)->c_str() << ':' << ' ' << CSVOperator.GetString(10,2)->c_str() ;
        CSVOperator.GetInt(10,2,OtdrTestsNum);//get datas num
        out2 << '
    ' << CSVOperator.GetString(11,1)->c_str();
        for(uiRow=12;uiRow<OtdrTestsNum+12;uiRow++)
        {
            out2 << '
    ' << uiRow-11 <<' ' << CSVOperator.GetString(uiRow,1)->c_str();
        }
    
        //OTDR Events
        ofstream out3("OTDR_Events.txt");
        out3<< CSVOperator.GetString(12+OtdrTestsNum,1)->c_str()<<':'<<' '<< CSVOperator.GetString(12+OtdrTestsNum,2)->c_str();
        CSVOperator.GetInt(OtdrTestsNum+12,2,OtdrEventsNum);//get Events num
        for(uiRow=12+OtdrTestsNum+1;uiRow<12+OtdrTestsNum+OtdrEventsNum+1;uiRow++)
        {
            out3 << '
    ';
            for(uiColumn=1;uiColumn<=3;uiColumn++)
            {
                std::string* pString = CSVOperator.GetString(uiRow,uiColumn);
                if (pString)
                {
                    if((uiColumn%3)!=0)
                        out3<<setiosflags(ios::left)<<setw(16)<<pString->c_str();
                    else
                        out3<<pString->c_str();
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    Oracle 单引号与双引号的区别
    oracle 生成随机数
    oracle 表空间及查看所有用户的表空间
    字节和字符的区别
    java io
    Oracle 基础
    gvim 常用键
    Python之struct
    Python之MySQLdb
    Python之sqlite3
  • 原文地址:https://www.cnblogs.com/timssd/p/4025564.html
Copyright © 2011-2022 走看看