前言

2022年2月9日更新本文章,使用版本為 27.2.1


CsvHelper 是一套老牌好用的 csv 資料的 C# 處理套件,在 NuGet 下載量高達 16.4百萬次。理所當然,在 .NET Core 也能使用這個套件。本篇文章簡單介紹 CsvHelper 安裝與使用範例,若有錯誤或任何建議,請各位先進不吝提出。
Csv,Comma-Separated Values 縮寫,透過逗號或其他字元分隔的資料文件




介紹

首先,我們必須先透過 NugGet 安裝 CsvHelper 套件,點選 工具 > NuGet 套件管理員 > 管理專案 NuGet 套件 > 點選瀏覽標籤,輸入 CsvHelper 後,選擇想要安裝的專案後,點選安裝。隨後即可開始透過 CsvHelper 開始讀取/寫入 csv 文件。




1. 讀取 csv 檔案

首先先定義資料格式的類別 (右鍵點選專案 > 新增項目 > 類別):
using System;

namespace CsvHelperApplication
{
    public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public DateTime Birthday { get; set; }
    }
}


接下來讀取 csv 檔案並透過 csv 進行處理,如下列程式碼範例所示,讀取位在 C:\PFE 資料夾底下的 Employee.csv 檔案,透過 csv.getRecords 方法逐一將資料轉換成類別物件:
class Program
{
    static void Main(string[] args)
    {
        var readConfiguration = new CsvConfiguration(CultureInfo.InvariantCulture)
        {
            HasHeaderRecord = true
        };

        using (var reader = new StreamReader("Employee.csv"))
        using (var csv = new CsvReader(reader, readConfiguration))
        {
            var records = csv.GetRecords<Employee>();
            foreach (var employee in records)
            {
                Console.WriteLine(employee.Name + "," + employee.Birthday);
            }
        }
    }
}


接下來你可以依據需求操作這些物件 (像是存入資料庫、呼叫API等後續處理),我們的範例在銀幕上顯示員工資料。


若你的 csv 檔案向下圖所示,不包含資料名稱(標頭)


您可以設定 HasHeaderRecord 為 false,讀取 csv 檔案時就不會處理資料名稱
csv.Configuration.HasHeaderRecord = false;
class Program
{
    static void Main(string[] args)
    {
        var readConfiguration = new CsvConfiguration(CultureInfo.InvariantCulture)
        {
            HasHeaderRecord = false
        };

        using (var reader = new StreamReader("Employee.csv"))
        using (var csv = new CsvReader(reader, readConfiguration))
        {
            var records = csv.GetRecords<Employee>();
            foreach (var employee in records)
            {
                Console.WriteLine(employee.Name + "," + employee.Birthday);
            }
        }
} }


你可以在物件類別內,透過 Index 或 Name 屬性來對應 csv 檔案內資料欄位
using System;

namespace CsvHelperApplication
{
    public class Employee
    {
        [Index(0)]
        public int Id { get; set; }

        [Index(1)]
        public string Name { get; set; }

        [Index(2)]
        public DateTime Birthday { get; set; }
    }
}
using System;

namespace CsvHelperApplication
{
    public class Employee
    {
        [Name("Id")]
        public int Id { get; set; }

        [Name("Name")]
        public string Name { get; set; }

        [Name("Birthday")]
        public DateTime Birthday { get; set; }
    }
}

注意:讀入大量 csv 資料時可能因為硬體規格或記憶體使用量,而無法完整讀取所有資料進行處理。如想要讀入兩萬筆資料,可能只有讀取 5000 筆資料進行處理。如果可以,請分多個檔案進行處理。



2. 寫入 csv 檔案

你可以透過物件類別,建立 List 後,使用 WriteRecords() 方法來寫入 csv 檔案
class Program
{
    static void Main(string[] args)
    {
        var writeRecords = new List<Employee>
        {
            new Employee { Id = 1, Name = "Ina", Birthday=DateTime.Now },
            new Employee { Id = 2, Name = "Duran", Birthday=DateTime.Now},
        };

        var writeConfiguration = new CsvConfiguration(CultureInfo.InvariantCulture)
        {
            HasHeaderRecord = false
        };

        using (var writer = new StreamWriter("Result.csv"))
        using (var csv = new CsvWriter(writer, writeConfiguration))
        {
            csv.WriteRecords(writeRecords);
        }
    }
}


寫入資料結果如下:


您可以在 CsvHelper 官方網站 找到更多範例

CsvHelper 功能強大且使用相當方便,算是一個老牌的套件。若您有需要對 csv 檔案進行操作的需求,不妨考慮使用這個套件吧。