前言
2022年2月9日更新本文章,使用版本為 27.2.1
範例: CsvHelper Sample
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 檔案進行操作的需求,不妨考慮使用這個套件吧。
4 留言
大大是否有少資料
回覆刪除依照程式碼沒有辦法跑
要安裝跟大大相同的版本 12.1.2 才能正確執行喔
刪除https://www.nuget.org/packages/CsvHelper/12.1.2
還有,會用到 csv.Configuration.HasHeaderRecord = false; 最前面要宣告
using CsvHelper.Configuration;
要用到 [Index(0)] 部分,該類別檔案最前面要宣告
using CsvHelper.Configuration.Attributes;
才能正確執行喔
感謝回覆,有空我再提供原始碼讓大家參考
刪除已經更新文章與程式碼至 CsvHelper 27.2.1,並且提供範例唷
刪除