C# で文字列を記入してファイル内のテキストを取得する方法を紹介します。
ファイルのデータを読み込むにはどうしたらいい!?
初期設定ファイルや設定ファイル等、ファイルに保存されているデータを読み込んでから処理することがあります。ファイルの読み込み方法を知っているとアプリケーションの開発の幅が広がります。
C# では読み込み以外にもファイルの書き込みも可能です。詳しくはこちらのサイトで紹介していますので、参考にしてみてください。
この記事ではファイルのテキストを読み込む方法を2種類(ReadToEnd・ReadLine)紹介していますので、ぜひ最後まで読んでみてください。
オススメの参考書
C#の使い方が丁寧に解説しており、「基礎からしっかりと学びたい」という初心者の方にオススメの一冊です。サンプルコードも記載してあり、各章の最後に復習問題があるので理解度を確認しながら読み進めることができます。新しい C# のバージョンにも対応している書籍です。
ファイルを読み込むには?
C# でファイルの読み込みをする場合は、「StreamReader クラス」を使うのが一般的です。ファイルの読み込み専用のクラスで、ファイルのテキストを読み込む ReadToEnd メソッド や ReadLine メソッド が用意されています。
メソッド名 | 説明 |
ReadToEnd | ストリームの文字を全て(ストリームの現在位置から末尾まで)読み込みます。 |
ReadToEndAsync | 非同期でストリームの文字を全て読み込みます。 |
ReadLine | ストリームから1行分の文字列を読み込みます。 |
ReadLineAsync | 非同期でストリームから1行分の文字列を読み込みます。 |
StreamReader はファイル名を指定します。このファイル名の拡張子は自由に設定が可能ですので、テキストファイル(.txt)やCSVファイル(.csv)、ログファイル(.log)からテキストを読み込めるという特徴があります。
指定したファイル名がない場合は例外が発生し、「ファイル ‘ファイルパス’ が見つかりませんでした。」という例外のメッセージが取得できます。
ファイルの読み込む方法
ここからはファイルからテキストを読み込む方法を紹介します。
まずは StreamReader を利用できるように、クラスファイルのヘッダー部分に名前空間「System.IO」を設定しましょう。
using System.IO;
ファイルからテキストを読み込むには、3つの処理を順番に行うのが基本です。
StreamReader クラスのコンストラクタの引数にファイルパス、エンコードの指定を行います。
StreamReader(ファイルパス, エンコード)
第1引数は string 型で、ファイル名もしくはファイルの絶対パスを指定します。
第2引数は必ずしも必要ではありません。文字のエンコードを指定しない場合は、デフォルト値(UTF-8)を使用してファイルのテキストを読み込みます。
エンコードにはいくつかの種類があり、C# でエンコードを指定する例を挙げておきます。
エンコードの種類 | エンコーの指定 |
日本語 Shift-JIS | Encoding.GetEncoding(“shift_jis”) |
日本語 EUC | Encoding.GetEncoding(“euc-jp”) |
日本語 JIS | Encoding.GetEncoding(“iso-2022-jp”) |
Unicode | Encoding.Unicode |
UTF8 | Encoding.UTF-8 |
UTF-32 | Encoding.UTF32 |
読み込むファイルを準備をしておきましょう。ここでは「sample.txt」という名前で以下のテキストを入力して、文字コードの種類を「ANSI」にします。
アプリケーションの実行ファイルがあるディレクトリ(bin\Debug)にファイルを保管しておきます。
ReadToEnd メソッド
StreamReader クラスの ReadToEnd メソッドは、ファイルの全てのテキストを1つの文字列として読み込む方法です。
private void ReadToEndFile()
{
//ファイル名
var fileName = "sample.txt";
//読み込むテキストを保存する変数
var text = "";
try
{
//ファイルをオープンする
using (StreamReader sr = new StreamReader(fileName, Encoding.GetEncoding("Shift_JIS")))
{
text = sr.ReadToEnd();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
Debug.WriteLine(text);
}
上記のソースコードを実行すると次の結果になります。ReadToEnd メソッドは改行を含めて1つの文字列として読み込むことができます。
月曜日
火曜日
水曜日
木曜日
金曜日
StreamReader クラスを使用した後は Close メソッドでストリームを閉じます。この時、Close メソッドを呼び出すことを忘れてしまうとリソースが解放されません。
using を使っておけば、Close メソッドを実装しなくても自動で解放処理を行うので 、Close メソッドの記述漏れを防ぐことができます。
ReadToEndAsync メソッド
非同期でファイルの全てのテキストを1つの文字列として読み込む方法です。
ファイルにある大量のテキストを取得すると発生するデッドロックを防止することができます。
private async Task ReadToEndFileAsync()
{
//ファイル名
var fileName = "sample.txt";
//読み込むテキストを保存する変数
var text = "";
try
{
//ファイルをオープンする
using (StreamReader sr = new StreamReader(fileName, Encoding.GetEncoding("Shift_JIS")))
{
text = await sr.ReadToEndAsync();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
Debug.WriteLine(text);
}
ReadToEnd メソッドを ReadToEndAsync メソッドに変更し、非同期のお約束事である「async / await」を付けます。
上記のソースコードを実行すると次の結果になります。ReadToEnd メソッドと同じで改行を含めて1つの文字列として読み込むことができます。
月曜日
火曜日
水曜日
木曜日
金曜日
ReadLine メソッド
StreamReader クラスの ReadLine メソッドで、指定したファイルのテキストを1行ずつ文字列として読み込む方法です。
ReadLine で1行ずつ文字列を読み込む場合は、StreamReader クラスに用意されている Peek メソッドを使って、読み取り対象のファイルに読み取りする行が存在するか確認しながら処理をします。Peek メソッドは読み取りする行がない場合は -1 を返します。
Peek メソッドの戻り値が0以上であるなら、読み取りする行が存在するということなので、ReadLine メソッドで読み取りする事ができます。
private void ReadLineFile()
{
//ファイル名
var fileName = "sample.txt";
//var fileName = @"C:\sample.txt"; 絶対パスでも良い
//読み込むテキストを保存する変数
var texts = new List<string>();
try
{
//ファイルをオープンする
using (StreamReader sr = new StreamReader(fileName, Encoding.GetEncoding("Shift_JIS")))
{
while (0 <= sr.Peek())
{
texts.Add(sr.ReadLine());
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
foreach (var text in texts) { Debug.WriteLine(text); }
}
上記のソースコードを実行すると次の結果になります。ReadLine メソッドは1行毎に読み込むことができます。while文で1行目から最後の行まで繰り返して読み込みをしています。
月曜日
火曜日
水曜日
木曜日
金曜日
ReadLineAsync メソッド
非同期で指定したファイルのテキストを1行ずつ文字列として読み込む方法です。
ファイルにある大量のテキストを取得すると発生するデッドロックを防止することができます。
private async Task ReadLineFileAsync()
{
//ファイル名
var fileName = "sample.txt";
//var fileName = @"C:\sample.txt"; 絶対パスでも良い
//読み込むテキストを保存する変数
var texts = new List<string>();
try
{
//ファイルをオープンする
using (StreamReader sr = new StreamReader(fileName, Encoding.GetEncoding("Shift_JIS")))
{
while (0 <= sr.Peek())
{
texts.Add(await sr.ReadLineAsync());
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
foreach (var text in texts) { Debug.WriteLine(text); }
}
ReadLine メソッドを ReadLineAsync メソッドに変更し、非同期のお約束事である「async / await」を付けます。
上記のソースコードを実行すると次の結果になります。ReadLine メソッドと同じで1行毎に読み込むことができます。
月曜日
火曜日
水曜日
木曜日
金曜日
まとめ
この記事ではファイルから文字列を読み込む方法を紹介しました。
System.IO の StreamReader クラスを利用することで、ファイルからテキストを読み込むことができます。読み込むための2種類のメソッドが用意されていますので、使用用途に応じて使い分けをしましょう。
- ReadToEndメソッド:ファイルのテキストを全て読み込む場合に使用する
- ReadLineメソッド:1行だけテキストを読み込む場合に使用する
StreamReader クラスや他のクラスを使えば、ファイルの最後の行だけ読み込みをすることも可能です。気になる方は以下のサイトを参考にしてみてください。
以上、最後まで読んで頂きありがとうございました。