テキストファイルを1行ずつ読み込むコードを紹介します。
概要
テキストファイルを開き、ファイル内容を読み取ります。今回紹介するコードは、ファイル内容を1行ずつ読み取るため、行ごとに処理をする場合において、利用しやすいコードです。半面、大きいテキストファイルを開く場合は時間がかかります。
大きいテキストファイルを短時間で読み込む場合は、一度にまとめてファイルを読み出します。まとめてファイルを読み出すコードついては、
こちらの記事を参照してください。
実装
テキストファイルから1行ずつ読み込む場合はStreamReaderクラスのReadLineメソッドを用います。
ReadLineで読み込んだ場合は改行コードは含まれないため、TextBoxに改行された形で出力する場合には改行コードを追加する必要があります。
プログラム
UI
下図のUIを作成します。Button, Label, TextBox, OpenDialog を配置します。
コード
下記のコードを記述します。実際は、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 System.IO;
namespace TextFileSingleRead
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
label1.Text = openFileDialog1.FileName;
string file = openFileDialog1.FileName;
StreamReader sr = new StreamReader(file, Encoding.GetEncoding("SHIFT_JIS")););
while (sr.EndOfStream == false) {
string line = sr.ReadLine();
textBox1.Text += line + "\r\n";
}
sr.Close();
}
}
}
}
解説
ファイルを開くダイアログを開きます。ダイアログでファイルが選択された場合に、if文内が実行されます。
if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
...
}
選択されたファイル名をLabelに表示します。また、StreamReaderを利用してファイルを開きます。
label1.Text = openFileDialog1.FileName;
string file = openFileDialog1.FileName;
StreamReader sr = new StreamReader(file, Encoding.GetEncoding("SHIFT_JIS"));
ファイルの内容を読み出します。1行ずつ処理をするため、StreamReaderのReadLine()メソッドを呼び出し、1行ずつ読み出します。ファイルの終了はStreamReaderのEndOfStreamプロパティで検出できるため、EndOfStreamがfalseである限りループを続けます。
読み出したファイルの内容をテキストボックスに表示します。すべての処理が終了したら、StreamReaderを閉じます。
while (sr.EndOfStream == false) {
string line = sr.ReadLine();
textBox1.Text += line + "\r\n";
}
sr.Close();
補足
以下のコードのように、FileStreamを利用しても同様の動作となります。
vate void button1_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
label1.Text = openFileDialog1.FileName;
string file = openFileDialog1.FileName;
FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fs, Encoding.GetEncoding("SHIFT_JIS"));
while (sr.EndOfStream == false) {
string line = sr.ReadLine();
textBox1.Text += line + "\r\n";
}
sr.Close();
fs.Close();
}
}
実行結果
プロジェクトを実行します。下図のウィンドウが表示されます。
[button1]をクリックします。ファイルを開くダイアログが表示されます。読み込むファイルを選択します。
ファイルの内容が読み込まれテキストボックスに表示されます。
テキストファイルを読み込むことができました。
例外処理を含めたコード
実際の利用では、例外処理を含めたコードを記述します。例外処理を含めることでファイルが存在しなかった場合や、ファイルの読み込み中にエラーが発生した場合でもアプリケーションをクラッシュさせずに処理を継続して実行できます。また途中で処理が中断することによりファイルが開いたままになる状態を防ぐこともできます。例外処理の詳細については、catchに関しては
こちらの記事、finallyに関しては
こちらの記事を参照してください。
例外処理を含める場合は、下記のコードを記述します。
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 System.IO;
namespace TextFileSingleRead
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
label1.Text = openFileDialog1.FileName;
string file = openFileDialog1.FileName;
FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fs));
try {
while (sr.EndOfStream == false) {
string line = sr.ReadLine();
textBox1.Text += line + "\r\n";
}
}
catch (Exception exc) {
//例外が発生した場合の処理を記述します。
}
finally {
sr.Close();
fs.Close();
}
}
}
}
}
文字コードを指定する場合
読み取るテキストファイルの文字コードを指定する場合は、StreanmReader のコンストラクタの第二引数にエンコードするEncodingオブジェクトを与えます。下記のコードではSHIFT-JISとしてファイルを開きます。
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 System.IO;
namespace TextFileSingleRead
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
label1.Text = openFileDialog1.FileName;
string file = openFileDialog1.FileName;
FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fs, Encoding.GetEncoding("SHIFT_JIS"));
try {
while (sr.EndOfStream == false) {
string line = sr.ReadLine();
textBox1.Text += line + "\r\n";
}
}
catch (Exception exc) {
}
finally {
sr.Close();
fs.Close();
}
}
}
}
}
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
- まとめて処理
- 行ごとの処理
- FileStraeamの利用サンプル
最終更新日: 2020-05-25
作成日: 2010-08-08