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
.