若要在 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);
}