TextFieldParserクラスを利用してCSVを取り込む方法です。
TextFieldParserクラスを使ってCSVファイルを読み込む
C#には、CSV(カンマ区切り)やTSV(タブ区切り)を扱うためのTextFieldParserクラスが用意されています。このTextFieldParserクラスを使用すると簡単にCSVを取り込むことができます。
事前準備:「Microsoft.VisualBasic」の参照を追加する
まずは事前準備です。
Visual Studio 上で「Microsoft.VisualBasic」の参照を追加します。次の画像の様にして、参照を追加して下さい。
Visual Studio のソリューションエクスプローラーのツリーから「参照」を右クリックします。
「参照」を右クリックすると、コンテキストメニューが表示されるので、「参照の追加」をクリックします。
すると、参照を追加する画面が表示されるので、次の手順に沿って参照を追加して下さい。
- 右上の検索ボックスに「Microsoft.VisualBasic」と入力
- 中央に表示される「Microsoft.VisualBasic」にチェック
- OKボタンをクリック
これで参照の追加は完了です。
サンプル画面
サンプルとして画面を用意しました。
仕様はとても簡単で、
- 上のテキストボックスに取り込み対象のCSVのファイルパスを入力
- クリックする
- 下のテキストボックスにCSVの内容が表示される
というものです。
サンプルコード
ではサンプルコードです。
//TextFieldParserを利用するために記述 using Microsoft.VisualBasic.FileIO; private void cmdCsvImport_Click(object sender, EventArgs e) { string strFilePath = txtPath.Text; try { //未入力チェック if (strFilePath.Trim() == "") { MessageBox.Show("ファイルパスを入力して下さい。" , "未入力チェック" , MessageBoxButtons.OK , MessageBoxIcon.Error); } //ファイル存在チェック if (System.IO.File.Exists(strFilePath) == false) { MessageBox.Show("ファイルが存在しません。" , "ファイル存在チェック" , MessageBoxButtons.OK , MessageBoxIcon.Error); } //TextFieldParserのインスタンス生成 var objParser = new TextFieldParser(strFilePath , Encoding.GetEncoding("Shift_JIS")); using (objParser) { //--CSV読み込み準備 START --// // 区切り文字をカンマに設定 objParser.TextFieldType = FieldType.Delimited; objParser.SetDelimiters(","); // 空白があった場合にTrimしない objParser.TrimWhiteSpace = false; //--CSV読み込み準備 END --// //--CSV読み込み処理 START --// // ファイルの最後まで1行ずつループ while (!objParser.EndOfData) { string strVeiwResult = ""; // フィールドを読込 string[] arrayRow = objParser.ReadFields(); foreach (string strField in arrayRow) { // カンマ区切りで出力文字列を生成 strVeiwResult = strVeiwResult + strField + ","; } //列の末尾のカンマを削除 strVeiwResult = strVeiwResult.TrimEnd(','); //テキストボックスに表示 txtResult.Text = txtResult.Text + strVeiwResult + Environment.NewLine; } //--CSV読み込み処理 END --// } } catch (Exception ex) { MessageBox.Show(ex.Message , "エラー" , MessageBoxButtons.OK , MessageBoxIcon.Error); } }
尚、今回のテストデータは次のものを使います。
いぬ,10歳,オス
ねこ,5歳,メス
パンダ,20歳,メス
ゴリラ,18歳,オス
ウマ,12歳,牝馬
部長,50歳,おっさん
これをコピペしてcsvファイルに保存して下さい。
では実行してみます。
これが実行前の画面。
こちらが実行後。
ちゃんと取り込めてますね。
読み込み時の設定について
読み込み前に設定すれば、色々な読み込み方が出来ます。上記のソースの場合は、
// 区切り文字をカンマに設定 objParser.TextFieldType = FieldType.Delimited; objParser.SetDelimiters(","); // 空白があった場合にTrimしない objParser.TrimWhiteSpace = false;
としていますが、これは、
- デリミタ(区切り文字)はカンマ
- 空白があった場合にTrim(削除)しない
という意味です。
例えば、タブ区切りの場合は、SetDelimitersメソッドの引数にタブを指定してあげればTSVファイルも読み込めます。
objParser.SetDelimiters("\t");
また、フィールドにダブルクォーテーション「””」がある場合(「”いぬ”,”50歳”,”オス”」みたいなデータ)は、HasFieldsEnclosedInQuotesプロパティをTrueに設定すればOKです。
objParser.HasFieldsEnclosedInQuotes = true;
他のプロパティやメソッドはMSDNに掲載されていますので、そちらを参照下さい。
参考サイト
TextFieldParser クラス (Microsoft.VisualBasic.FileIO) | Microsoft Docs
.