CSVの読み書き

受託開発担当のIです。

開発をしているとCSVを扱うことがたまにあります。そういった時、自分で実装するのも良いのですが今回はCsvHelperというライブラリを使ってみたので簡単に紹介します。

開発環境

開発環境、言語は以下の通りです。

Visual Studio 2015 RC
.Net Framework 4.5.2
Visual C#

導入方法

Visual Studio 2015 RCでの導入方法を説明します。

メニュー→ツール→NuGetパッケージマネージャ→ソリューションのNuGetパッケージの管理...
を選択し、「NuGet Package Manager」を開いてください。

NuGetPackageManager

右上の検索ボックスに「CsvHelper」と入力して検索、見つかったら右の「Install」ボタンを押下してプロジェクトに追加してください。
インストールが完了するとプロジェクトの参照一覧に「CsvHelper」が追加されます。

読み込み

CSVファイルの読み込み方法を説明します。

次のCSVファイルを読み込んでみます。

test.csv

111,Sato,Sato@testhos.co.jp
112,Wada,Wada@testhos.co.jp
113,Yoshida,Yoshida@testhos.co.jp

まずはマッピングを定義します。

	public class Customer
	{
		public long Id { get; set; }
		public string Name { get; set; }
		public string Email { get; set; }
	}

	public class CustomerMap : CsvClassMap<Customer>
	{
		public CustomerMap()
		{
			Map(m => m.Id).Index(0);
			Map(m => m.Name).Index(1);
			Map(m => m.Email).Index(2);
		}
	}

ヘッダー行はないのでConfiguration.HasHeaderRecordはfalse、Configuration.RegisterClassMapでマッピングを登録。
そして定義したマッピングを使用して読み込み。

	MainWindowViewModel model = (MainWindowViewModel)this.DataContext;
	using (CsvParser parser = new CsvParser(new StreamReader(@"c:\test\test.csv", Encoding.GetEncoding("Shift_JIS"))))
	{
		parser.Configuration.HasHeaderRecord = false;
        parser.Configuration.RegisterClassMap<CustomerMap>();
		CsvReader reader = new CsvReader(parser);
		List<Customer> customerList = reader.GetRecords<Customer>().OrderBy(x => x.Id).ToList();
		model.CustomerList = new ObservableCollection<Customer>(customerList);
	}

読み込んだCSVデータをDataGridに表示。

csvdatagrid

このようにCsvHelperを使えば簡単にCSVファイルを読み込むことが出来ます。

書き込み

CSVファイルの書き込み方法を説明します。

先ほど読み込んだデータを追加、変更します。

csvdatagrid3

書き込むCSVにもヘッダーは必要ないのでConfiguration.HasHeaderRecordはfalse、Configuration.RegisterClassMapでマッピングを登録。
データを変更したDataGridにバインドしてあるソースをCSVファイルに書き込み。

	MainWindowViewModel model = (MainWindowViewModel)this.DataContext;
	using (var writer = new CsvWriter(new StreamWriter(@"c:\test\test2.csv", false, Encoding.GetEncoding("Shift_JIS"))))
	{
		writer.Configuration.HasHeaderRecord = false;
		writer.Configuration.RegisterClassMap<CustomerMap>();
		writer.WriteRecords(model.CustomerList);
	}

CSV出力結果は以下の通り。

test2.csv

111,Sato,Sato@testhos.co.jp
112,Kamiya,Kamiya@testhos.co.jp
113,Yoshida,Yoshida@testhos.co.jp
118,Sakata,Sakata@testhos.co.jp

書き込みも読み込みと同様に簡単に出来ました。

まとめ

TextFieldParserや、ODBC data providerなど色々試してみましたが、今回使用したCsvHelperは結構使いやすいと思いました。今回使用したヘッダーの設定以外の細かい設定もCsvWriter、CsvParserのConfigurationで設定できるようです。いろいろ試してみてください。