【C#】【CsvHelper】CsvHelperによるマッピングを利用しないCSV取り込み
Csvファイルの取り込み、書き込みでいいライブラリは無いものかと探していたところ、CsvHelperにたどり着きました。
基本的な使い方としては、データの格納クラスとマッピングするためのクラスを作成して利用するのがベターのようですが、、、。
今回は、動的に変更される可能性のあるCSVファイルを扱うため、とりあえずコレクションに格納するためのプログラムを書いてみました。
次回にでもMappingを利用した形式を書き留めたいと思います。
対象のCSVファイル
Dynamics CRMからまるまるエクスポートして、Csv化したものですが、以下のようなCSVファイルを今回利用します。
取引先企業名,代表電話,住所 1: 市区町村,取引先責任者,電子メール (取引先責任者) フォース コーヒー (サンプル),03-2232-019x,中間市,早川 諭 (サンプル),someone_a@example.com リビングウェア (サンプル),03-2232-019x,船橋市,小原 すみ江 (サンプル),someone_b@example.com アドベンチャー ワークス (サンプル),03-2232-019x,世田谷区,清岡 裕美子 (サンプル),someone_c@example.com ファブリカム (サンプル),03-2232-019x,世田谷区,佐々木 理恵 (サンプル),someone_d@example.com ブルー ヤンダー航空 (サンプル),03-2232-019x,東大阪市,佐本 久明 (サンプル),someone_e@example.com シティ パワー アンド ライト (サンプル),03-2232-019x,神戸市西区,和辺 義隆 (サンプル),someone_f@example.com コントソ製薬 (サンプル),03-2232-019x,神戸市西区,山元 憲次 (サンプル),someone_g@example.com アルパイン スキー ハウス (サンプル),03-2232-019x,平塚市,加須 紀夫 (サンプル),someone_h@example.com エー データム コーポレーション (サンプル),03-2232-019x,神戸市西区,越安 辰夫 (サンプル),someone_i@example.com コーホー ワイナリー (サンプル),03-2232-019x,世田谷区,友野 史郎 (サンプル),someone_j@example.com
コード
マッピングクラスを利用するときは、GetRecordsメソッドなどで、一括で取得できますが、マニュアル取得をする場合は、CsvReaderクラスのReadメソッドを利用して、1レコードずつ取得・処理していきます。
今回はList<Dictionary<string,string>>に格納したデータを返すクラスを作成してみました。
ファイルパスやエンコーディングコードはそれぞれ指定してあげてください。
using System.IO; using System.Collections.Generic; using System.Linq; using System.Text; using CsvHelper; namespace MyProject.CsvHelperTest { class ReadCsvFileNotMapping { private string FILE_PATH = "account.csv"; private int ENCODING_CODE = 932; private List<Dictionary<string, string>> _records = new List<Dictionary<string, string>>(); private Dictionary<string, string> _Fieldes; public List<Dictionary<string, string>> Records { get { return _records; } } public ReadCsvFileNotMapping() { using (var _reader = new CsvReader(new StreamReader(FILE_PATH, Encoding.GetEncoding(ENCODING_CODE)))) { // Set ListData and Dictionary for CSV Data while (_reader.Read()) { _Fieldes = new Dictionary<string, string>(); for (int i = 0; i < _reader.CurrentRecord.Length; i++) { _Fieldes[_reader.FieldHeaders[i]] = _reader.CurrentRecord.ElementAt(i); } _records.Add(_Fieldes); } } } } }
Mainプログラム
using System; namespace MyProject.CsvHelperTest { class Program { static void Main(string[] args) { var csv = new ReadCsvFileNotMapping(); foreach (var fields in csv.Records) { Console.WriteLine("{0} : {1} : {2} : {3}", fields["取引先企業名"], fields["代表電話"], fields["住所 1: 市区町村"], fields["取引先責任者"]); } Console.ReadKey(); } } }
実行結果
以下のような形でデータを取得できました。