1. 程式人生 > >CSV檔案(可以轉換為Excel)的讀寫

CSV檔案(可以轉換為Excel)的讀寫

有時候會碰到用C++讀寫Excel檔案的情況,我們可以通過讀寫CSV檔案,然後將CSV檔案轉換成Excel檔案進行。

經常需要一些配置資訊,在啟動的時候程式將這類資訊讀入記憶體中使用,CSV是個不錯的選擇,這裡提供一個CSV的讀寫類,預設將第一行當做欄位名,通過欄位名去讀寫內容

先看程式碼

CSVFile.h

  1. #ifndef __CSVFile_H__
  2. #define __CSVFile_H__
  3. #include <fstream>
  4. #include <string>
  5. #include <sstream>
  6. #include <vector>
  7. class CSVFile  
  8. {  
  9. public:  
  10.     bool    Open(bool bIsRead, constchar* strPath, constchar* strFilename);  
  11.     // 讀介面
  12.     bool    CSVReadNextRow();  
  13.     template<class T>  
  14.     bool    CSVRead(constchar* strFieldName, T& data)  
  15.     {  
  16.         if (m_nFileState != FILE_STATE_READ)  
  17.         {  
  18.             returnfalse;  
  19.         }  
  20.         int n   = FindField(strFieldName);  
  21.         if (n == -1 || n >= m_CSVCurRow.size())  
  22.         {  
  23.             returnfalse;  
  24.         }  
  25.         std::stringstream ss;  
  26.         ss << m_CSVCurRow[n];  
  27.         ss >> data;  
  28.         returntrue;  
  29.     }  
  30.     // 寫介面
  31.     void    CSVWriteNextRow();  
  32.     template<class T>  
  33.     bool    CSVWrite(constchar* strFieldName, T data)  
  34.     {  
  35.         if (m_nFileState != FILE_STATE_WRITE)  
  36.         {  
  37.             returnfalse;  
  38.         }  
  39.         int n   = FindField(strFieldName);  
  40.         if (n == -1)  
  41.         {  
  42.             returnfalse;  
  43.         }  
  44.         std::stringstream ss;  
  45.         ss << data;  
  46.         m_CSVCurRow[n]  = ss.str();  
  47.         returntrue;  
  48.     }  
  49. private:  
  50.     typedef std::vector<std::string> ROWVEC;  
  51.     void    ReadCSVHead();  
  52.     void    RowParse(constchar* strRow, int nSize, ROWVEC& result);  
  53.     int     FindField(constchar* strRow);  
  54. private:  
  55.     enum
  56.     {  
  57.         FILE_STATE_NULL,  
  58.         FILE_STATE_READ,  
  59.         FILE_STATE_WRITE,  
  60.     };  
  61.     int         m_nFileState;  
  62.     std::fstream    m_CSVFile;  
  63.     ROWVEC  m_CSVHead;  
  64.     ROWVEC  m_CSVCurRow;  
  65. };  
  66. #endif // __CSVWriter_H__

CSVFile.cpp

  1. #include "CSVFile.h"
  2. #include <sstream>
  3. #include <assert.h>
  4. void    CSVFile::ReadCSVHead()  
  5. {  
  6.     char strHeadLine[4096];  
  7.     m_CSVFile.getline(strHeadLine, sizeof(strHeadLine));  
  8.     RowParse(strHeadLine, sizeof(strHeadLine), m_CSVHead);  
  9. }  
  10. void    CSVFile::RowParse(constchar* strRow, int nSize, ROWVEC& result)  
  11. {  
  12.     result.clear();  
  13.     bool    bIsInWord   = false;  
  14.     bool    bIsHaveSpace    = false;  
  15.     std::string strCurWorld;  
  16.     for (int i=0; i<nSize; i++)  
  17.     {  
  18.         char ch = strRow[i];  
  19.         if (ch == '\0')  
  20.         {  
  21.             if (i >= 1 && strRow[i-1] == ',')  
  22.             {  
  23.                 strCurWorld = ' ';  
  24.             }  
  25.             break;  
  26.         }  
  27.         bool bIsAdd = true;  
  28.         switch (ch)  
  29.         {  
  30.         case',':  
  31.             {  
  32.                 if (!bIsInWord)  
  33.                 {  
  34.                     // 一項結束
  35.                     result.push_back(strCurWorld);  
  36.                     bIsInWord   = false;  
  37.                     bIsHaveSpace    = false;  
  38.                     strCurWorld = "";  
  39.                     bIsAdd  = false;  
  40.                 }  
  41.             }  
  42.             break;  
  43.         case'"':  
  44.             {  
  45.                 if (!bIsInWord)  
  46.