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を愛用