在 C# 中讀寫中文 CSV:CsvHelper

August 30, 2024

若要在 C# 中讀寫 CSV (Comma-Separated Values),可以從 NuGet 安裝 CsvHelper。CsvHelper 在眾多處理 CSV 檔案的函式庫內,是資源豐富、相關文件齊全的選擇。

安裝後的使用

我們使用收支作為範例 CSV 檔案:

Item,Income,Expense
零用錢,100,0
糖果,0,15
飲料,0,30

一開始需要先設定 CSV 的組態:

csvConfig = new CsvConfiguration(CultureInfo.InvariantCulture) // 不考慮文化特性
{
    HasHeaderRecord = true, // CSV 包含標頭
    MissingFieldFound = null // 欄位沒有值時要如何處理,這裡指定為 null
};

關於 MissingFieldFound 屬性的使用,可以參考:c# - How to configure CsvHelper to skip MissingFieldFound rows - Stack Overflow

由於 .NET Core 1.0 開始沒有內建的編碼資料,而 CSV 通常以 Big5 編碼儲存,想要讀寫中文資料時,需要自行加入以下程式:

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

接著建立收支資料物件:

public class Spending
{
     public string? Item { get; set; }
     public decimal? Income { get; set; }
     public decimal? Expense { get; set; }
}

資料物件可以有不同的欄位配對方式,請往下閱讀各參考資料

可以用 StreamReader 讀取檔案,並指定編碼為 Big5,接著以 CsvReader 將內容轉為資料物件:

string filename = "spending.csv";
using (var reader = new StreamReader(filename, Encoding.GetEncoding("BIG5")))
using (var csv = new CsvReader(reader, csvConfig))
{
    var records = csv.GetRecords<Spending>(); // 取得收支資料
    return records;
}

當我們建立或修改收支資料後,可以用 StreamWriter 寫入檔案、指定 Big5 編碼,寫入時使用 CsvWriter 將資料物件轉為 CSV 格式:

string filename = "spending_edited.csv";
var records = new List<Spending>();
// ... 加入收支資料到 records 列表
using (var writer = new StreamWriter(filename, false, Encoding.GetEncoding("BIG5")))
using (var csv = new CsvWriter(writer, csvConfig))
{
    csv.WriteRecords(records);
}

參考資料