TextFieldParserを利用してCSVファイルやTSVファイルを読み込む - C#

C#でTextFieldParserを利用してCSVファイル(カンマ区切りファイル)を読み込むコードを紹介します。

概要

CSVファイルでは個々のフィールドの情報を取り出すため、カンマの区切り等の検出などのパースが必要ですが、TextFieldParserを利用すると簡単にCSVのパースができます。ここではTextFieldParserを用いたCSVファイルの読み込みを紹介します。

TextFieldParserクラスはMicrosoft.VisualBasic名前空間にあります。プロジェクトにMicrosoft.VisualBasicアセンブリの参照を追加する必要があります。

プログラム

事前準備 (Microsoft.VisualBasic アセンブリの参照追加)

ソリューションエクスプローラのプロジェクトの参照ノードをクリックして選択し、右クリックします。ポップアップメニューが表示されます。メニューの[参照の追加]をクリックします。


[参照マネージャー]ダイアログボックスが表示されます。左側の[フレームワーク]を選択し、一覧から[Microsoft.VisualBasic]の項目をクリックして左側にチェックをつけます。(下図)
設定後ダイアログの[OK]ボタンをクリックします。


ソリューションエクスプローラの参照ノードに"Microsoft.VisualBasic"アセンブリへの参照が追加できます。

UI

下図のUIを作成します。ボタン、ラベル、テキストボックスを配置します。テキストボックスはMultiLinesプロパティをtrueに設定し複数行のテキストボックスとします。

コード

下記のコードを記述します。実際はButton1のClickイベントの実装です。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.VisualBasic.FileIO;

namespace CSVTextFieldParser
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      if (openFileDialog1.ShowDialog() == DialogResult.OK) {
        label1.Text = openFileDialog1.FileName;

        TextFieldParser parser = new TextFieldParser(openFileDialog1.FileName, Encoding.GetEncoding("Shift_JIS"));
        parser.TextFieldType = FieldType.Delimited;
        parser.SetDelimiters(",");// ","区切り
        //parser.SetDelimiters("\t");                    // タブ区切り(TSVファイルの場合)

        while (parser.EndOfData == false) {
          string[] column = parser.ReadFields();

          for (int i = 0; i < column.Length; i++) {
            textBox1.Text += column[i] + "\r\n";
          }
          textBox1.Text += "===\r\n";
        }
      }
    }
  }
}

解説

  if (openFileDialog1.ShowDialog() == DialogResult.OK) {
    ...
  }
上記コードにより、ファイル選択ダイアログボックスを開きます。ファイル選択ダイアログボックスでファイルが指定された場合にifブロック内を実行します。

  TextFieldParser parser = new TextFieldParser(openFileDialog1.FileName, Encoding.GetEncoding("Shift_JIS"));
TextFieldParser のインスタンスを作成します。コンストラクタの第一引数には読み込むCSVファイルのファイルパス、第二引数にエンコーディングを与えます。

  parser.TextFieldType = FieldType.Delimited;
  parser.SetDelimiters(",");// ","区切り
TextFieldParserを設定します。今回は、CSVファイルをパースするため、TextFieldType は FieldType.Delimitedを設定します。また、デリミタ(区切り文字)は","カンマを指定します。

  while (parser.EndOfData == false) {
    string[] column = parser.ReadFields();

    for (int i = 0; i < column.Length; i++) {
      textBox1.Text += column[i] + "\r\n";
    }
    textBox1.Text += "===\r\n";
  }
whileループでCSVファイルをパースします。パース結果はstring配列の形式で、TextFieldParserのReadFields()メソッドの戻り値で取得できます。取得した結果をテキストボックスに表示します。

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[button1]をクリックします。ファイルを開くダイアログボックスが表示されます。読み込むCSVファイルを選択します。


今回読み込むCSVファイルの内容は下記になります。

CSVファイル (smaple.txt)

1,Penguin,200
2,Duck,100
3,にわとり,240
4,くじら,120
5,麒麟,580


CSVファイルが読み込まれ、パースされた結果がテキストボックスに表示されます。


CSVファイルをパースできました。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2010-08-13
iPentec all rights reserverd.