【C#】CsvHelperによるCSV操作

C#

CsvHelperとは

CSVファイルの読み書きができます。
取り込むデータの型指定やインデックス付与をすることができるためデータとして扱いやすくなります。

入手方法

名称バージョン
入手場所Nuget
ライセンスMS-PL Or Apache-2.0 license

実装例

D:\test.csvのCSVを読み込みコンソールに表示していく実装例になります。

事前作業

Nugetからダウンロードしてプロジェクトにインポートする。

環境

名称バージョン
フレームワークWPF
.NetFrameworkv4.7.2
CsvHelperv30.0.1

実装例


using System;
using System.Windows;
using System.IO;
using CsvHelper;
using CsvHelper.Configuration;
using CsvHelper.Configuration.Attributes;

namespace WpfApp
{
	public partial class MainWindow : System.Windows.Window
	{
		public MainWindow()
		{
			try
			{
				List<csvData> list = new List<csvData>();
				list.AddRange(GetCSVRecords(D:\\test.csv));
				foreach(row in list)
				{
					Console.WriteLine("日付{0} データ:{1} データ:{2} データ:{3}",row.DATE, row.Data1, row.Data2, row.Data3);
				}
			}
			catch (System.Exception ex)
			{
				Console.WriteLine(ex.Message);
			}
		}
		
		private List<csvData> GetCSVRecords(string file)
		{
			try{
				// .NET 6 の場合でShift-jisをエンコードする場合は下記の処理が必要
				//Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

				//ヘッダあり
				var config = new CsvHelper.Configuration.CsvConfiguration(new CultureInfo("ja-JP", false))
				{
					HasHeaderRecord = true
				};

				using (StreamReader reader = new StreamReader(file, Encoding.GetEncoding("shift-jis")))
				{
					using (CsvReader csvReader = new CsvReader(reader, config))
					{
						// Formatなど詳細を設定する場合はMapクラスを使う
						//csvReader.Context.RegisterClassMap<DataClassMap>();
						var rows = csvReader.GetRecords<csvData>();
						return rows.ToList();
					}
				}
			}
			catch
			{
				throw;
			}
		}
	}
	
	public class csvData
	{
		[Index(0)]
		public DateTime DATE { get; set; }
		[Index(1)]
		public double? Data1 { get; set; }
		[Index(2)]
		public double? Data2 { get; set; }
		[Index(3)]
		public string Data3 { get; set; }
		[Index(4)]
	}
}

最後に

StreamReaderだけだとデータのマッピングが面倒くさく、カラムが大量にあるときに苦戦します。CSVを読み込むときはなるべく利用した方が楽になるパターンが多いです。