1. 程式人生 > >CSV標準格式解析與libcsv++實現

CSV標準格式解析與libcsv++實現

CSV檔案是一種簡單的資料表描述檔案,其各欄位值使用半形逗號分隔。CSV格式有很多變種,即使有一個標準文件RFC4180,各個程式對它的支援也不盡相同。最近利用閒暇時間使用C++實現了RFC4180規定的CSV格式的解析,並命名為libcsv++。這裡簡單介紹一下RFC4180的描述:

1. 每一項“記錄”(record)為一行,使用CRLF分隔。例如:

       aaa,bbb,ccc CRLF
       zzz,yyy,xxx CRLF

2. 檔案的最後一行記錄可以不使用CRLF結尾 。例如:

       aaa,bbb,ccc CRLF
       zzz,yyy,xxx

3. 檔案的第一行可以是一個“頭部”(header),也可以是普通資料。無論是何種資料,欄位數必須一致。例如:

       field_name,field_name,field_name CRLF
       aaa,bbb,ccc CRLF
       zzz,yyy,xxx CRLF

4. 每一行記錄可以包含多個欄位,並以逗號分隔。欄位若以空格開始,這個(些)空格不會被忽略。最後一個欄位之後不能有逗號。例如:

       aaa,bbb,ccc

5. 每一個欄位可以使用也可以不使用雙引號包圍。如果欄位沒有使用雙引號包圍,則其中不允許出現雙引號。例如:

       "aaa","bbb","ccc" CRLF
       zzz,yyy,xxx

6. 欄位若包含有CRLF,雙引號和逗號,則該欄位應該被雙引號包圍。例如:

       "aaa","b CRLF
       bb","ccc" CRLF
       zzz,yyy,xxx

   以上檔案內容解析後只有兩行而不是三行。

7. 如果雙引號被用來包圍欄位,則欄位中的雙引號必須通過在其前加一個雙引號來轉義。例如:

       "aaa","b""bb","ccc"

翻譯得不好請見諒。至於實現就請移步github直接看程式碼了(https://github.com/jainyzau/libcsv-/),非常短的一段程式碼,可以方便地整合到需要的專案中。在解析中使用了  LineStart,  FieldStart,  FrontQuote,  BackQuote,  EscapeOn,  EscapeOff,  FieldEnd,  LineEnd,  ParseCompleted這樣的9個狀態,各個狀態代表什麼從字面上也很容易理解。測試的時候使用了google test框架,如果需要編譯測試用例,需要手動下載google test框架,編譯後將其與我的程式碼連結。