記事内に広告が含まれています。

【C#】超簡単にCSVファイルを読み込む!

TextFieldParserクラスを利用してCSVを取り込む方法です。

【スポンサーリンク】

TextFieldParserクラスを使ってCSVファイルを読み込む

C#には、CSV(カンマ区切り)やTSV(タブ区切り)を扱うためのTextFieldParserクラスが用意されています。このTextFieldParserクラスを使用すると簡単にCSVを取り込むことができます。

【スポンサーリンク】

事前準備:「Microsoft.VisualBasic」の参照を追加する

まずは事前準備です。

Visual Studio 上で「Microsoft.VisualBasic」の参照を追加します。次の画像の様にして、参照を追加して下さい。

Visual Studio のソリューションエクスプローラーのツリーから「参照」を右クリックします。

「参照」を右クリックすると、コンテキストメニューが表示されるので、「参照の追加」をクリックします。

すると、参照を追加する画面が表示されるので、次の手順に沿って参照を追加して下さい。

  1. 右上の検索ボックスに「Microsoft.VisualBasic」と入力
  2. 中央に表示される「Microsoft.VisualBasic」にチェック
  3. OKボタンをクリック

これで参照の追加は完了です。

【スポンサーリンク】

サンプル画面

サンプルとして画面を用意しました。

仕様はとても簡単で、

  1. 上のテキストボックスに取り込み対象のCSVのファイルパスを入力
  2. クリックする
  3. 下のテキストボックスに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)
構造化テキスト ファイルの解析に使用するメソッドとプロパティを提供します。
【スポンサーリンク】

参考サイト

TextFieldParser クラス (Microsoft.VisualBasic.FileIO) | Microsoft Docs

.