2015年4月6日 星期一

使用 CsvHelper - Part.2 資料讀取

上一篇介紹了如何使用 CsvHelper 將資料輸出到 CSV 檔案,既然有輸出,相對就會有讀取的需要,所以這一篇就說明如何使用 CsvHelper 將 CSV 檔案裡的資料給讀取出來。

 


這邊會先以一般輸出的 CSV 檔案來做處理,以下是我們用來輸出資料寫入到 CSV 檔案的程式內容,

image

輸出結果

image

以「Customers.csv」的輸出結果來操作使用 CsvHelper 的讀取處理。

 

一、讀取指定 CSV 檔案

其實讀取 CSV 檔案的操作蠻簡單的,建立 StreamReader 並指定要讀取的 CSV 檔案,然後建立 CsvReader,使用 CsvReader 的 GetRecords<T> 方法將資料從 CSV 檔案讀取出來,最後取得的就是指定類別的資料集合,

image

讀取結果

image

 

二、讀取自訂欄位輸出的 CSV 檔案

如果要讀取自訂欄位名稱的 CSV 檔案(例如上一篇的最後一個範例),

例如:

image

同樣也需要有 ClassMap 類別,這樣才知道等一下所讀到的資料要怎麼 Mapping 到指定的類別裡,

image

在輸出資料到 CSV 檔案的時候,需要在輸出前在 writer 的 Configuration 去註冊對應類別,同樣的在讀取資料的操作也是需要去註冊對應類別,

image

讀取結果

SNAGHTMLef33438

 


應該有些人會覺得使用 CsvHelper 去讀寫 CSV 並沒有什麼,因為用一般對文字檔案操作的方式也是可以做到,但是有沒有發現到,不論寫入或是讀取,都是對映著類別。

如果以讀取 CSV 檔案然後對映到類別的處理,使用以往的文字檔案讀取處理,將資料從 CSV 獨出來之後,還需要一筆一筆資料去做手動的對映,然而使用 CsvHelper 並不需要考慮到這些,只需要指定讀取的 CSV 檔案位置與名稱,然後指定讀取後要指定的類別,最後所得到的就是指定型別的資料集合(IEnumerable<T>)。同樣的,寫入的處理也是一樣,只需要指定要輸出的型別與資料,不需要太複雜的轉換、串接、判斷等等,很快就可以搞定,如果需要一些特殊的設定或處理,CsvHelper 都有提供設定方法給我們去做處理。

我是一個懶惰的人,但並不是說我就懶得去寫程式,而是要懂得如何應用一些既有的方法或使用別人已經寫好的第三方套件,好好的利用這些套件來讓我們處理掉這些繁瑣的資料處理,如此一來才有時間去處理真正棘手的問題上。

 

相關連結:

Github - CsvHelper
https://github.com/JoshClose/CsvHelper

CsvHelper Documentation
http://joshclose.github.io/CsvHelper/

Nuget - CsvHelper
http://www.nuget.org/packages/CsvHelper

 

以上

3 則留言:

  1. 我覺得這個CsvHelper方便歸方便,但是有一些小問題,直覺是使用CsvClassMap不太漂亮。
    我的話會選擇另外做Map而不去依賴CsvClassMap。

    我在上個專案時,
    客戶總是csv與xls傻傻分不清楚,常常把xls直接往網站上丟。
    我與PM討論了一下,乾脆同時支援excel file與csv file。

    後來是這樣重構的:
    IDataFile 1--* IDataRow 1--* IDataCell
    然後實作兩個data class與其row與cell
    ExcelDataFile : IDataFile
    CsvDataFile : IDataFile

    最後再另外做Map
    IDataFile dataFile = DataFileFactory.Create(stream);
    IEnumerable data = DataMapHelper.Map(dataFile);

    優點在於,我只要增加Class,就可以不管dataFile是啥,同時支援xls、xlsx與csv。
    缺點就是有些輪子必須自己刻、自己測試...
    不過,說不定已經有類似的第三方工具,只是沒有去找而已:p

    回覆刪除
    回覆
    1. 如何應用以及怎麼做,每個開發者都有工程師的浪漫,
      是否漂亮或是有無需要支援多種格式,在一開始的規劃都會講清楚,
      在功能的實作上就會針對需求去做是否支援多種格式,
      當只有一種格式可以使用時,開發者就有義務做好驗證與把關的處理,
      而不是要防止或一昧開放功能給使用者,
      開發者會有所堅持,
      如何使用、如何處理、如何架構,或是程式是否漂亮,
      對我而言,我所看到的是,不要過度設計、要符合需求、不要超過預期、專心做好需求所要的功能,
      不做無謂的優化與修改,因為過多的修改與放任需求者的索求,對於專案開發與開發者都是不健康的。

      刪除
    2. 可是往往,計畫趕不上變化、PM說不過客戶
      這時候,重構的技巧真的很重要XD
      這個例子,驗證和錯誤訊息當然是有做的,但客戶還是搞不清楚,沒事就來抱怨一下

      刪除

提醒

千萬不要使用 Google Talk (Hangouts) 或 Facebook 及時通訊與我聯繫、提問,因為會掉訊息甚至我是過了好幾天之後才發現到你曾經傳給我訊息過,請多多使用「詢問與建議」(在左邊,就在左邊),另外比較深入的問題討論,或是有牽涉到你實作程式碼的內容,不適合在留言板裡留言討論,請務必使用「詢問與建議」功能(可以夾帶檔案),謝謝。