C#

【C#】ファイルを読み込む方法を紹介(StreamReader)

C#で文字列を記入してファイル内のテキストを取得する方法を紹介します。

初期設定ファイルや設定ファイル等、ファイルに保存されているデータを読み込んでから処理することがあります。ファイルの読み込み方法を知っているとアプリケーションの開発の幅が広がります。

この記事ではファイルのテキストを読み込む方法を2種類(WReadToEnd・ReadLine)紹介していますので、ぜひ最後まで読んでみてください。

C#では読み込み以外にもファイルの書き込みも可能です。詳しくはこちらのサイトで紹介していますので、参考にしてみてください。

【C#】ファイルに書き込む方法を紹介(StreamWriter)C#でファイルに文字列(テキスト)を書き込むには、StreamWriterクラスを利用するのが一般的です。csvファイルやtxtファイル、logファイルなど出力することが可能です。書き込むためのメソッドには改行有りと改行無しがありますので、使用用途に応じて使い分けをしましょう。...

 

プログラミングを更に学びたい方必見

選抜された現役エンジニアから学べるプログラミングスクールで、現場や副業で役に立つノウハウやスキルを習得してみませんか?

オンラインに特化しているので場所に捉われず、自分のライフスタイルに合わせて受講することができます。

副業に興味がある方に人気の「はじめての副業コース」をはじめ、Web開発やシステム開発・アプリ開発などカテゴリ毎に受講ができ、初心者の方でも挫折することなく学ぶことができます。

まずはこの機会に現役のプロに無料相談をしてみましょう。

\ プログラミングスクールの詳細を確認する /

ファイルを読み込むには?

C#でファイルの読み込みをする場合は、「StreamReaderクラス」を使うのが一般的です。ファイルの読み込み専用のクラスで、ファイルのテキストを読み込む ReadToEndメソッド や ReadLineメソッド が用意されています。

メソッド名説明
ReadToEndストリームの文字を全て(ストリームの現在位置から末尾まで)読み込みます。
ReadToEndAsync非同期でストリームの文字を全て読み込みます。
ReadLineストリームから1行分の文字列を読み込みます。
ReadLineAsync非同期でストリームから1行分の文字列を読み込みます。

※ストリームは「データの流れ」を意味し、ストリームでファイル内のテキストが読み込まれる。
 ストリームには「現在の位置」を基準にしてデータの読み書きをする。
 ストリームを読み書きすると読み書きした分だけ自動的に位置が移動する。

StreamReader はファイル名を指定します。このファイル名の拡張子は自由に設定が可能ですので、テキストファイル(.txt)やCSVファイル(.csv)、ログファイル(.log)からテキストを読み込めるという特徴があります。

指定したファイル名がない場合は例外が発生し、「ファイル ‘ファイルパス’ が見つかりませんでした。」という例外のメッセージが取得できます。

ファイルの読み込む方法

ここからはファイルからテキストを読み込む方法を紹介します。

まずはStreamReaderを利用できるように、csファイルのヘッダー部分に名前空間「System.IO」を設定しましょう。

using System.IO;

ファイルからテキストを読み込むには、3つの処理を順番に行うのが基本です。

StreamReaderクラスのコンストラクタの引数にファイルパス、エンコードの指定を行います。

よく使うコンストラクタ

StreamReader(ファイルパス, エンコード)

第1引数はstring型で、ファイル名もしくはファイルの絶対パスを指定します。

第2引数は必ずしも必要ではありません。文字のエンコードを指定しない場合は、デフォルト値(UTF-8)を使用してファイルのテキストを読み込みます。

エンコードにはいくつかの種類があり、C#でエンコードを指定する例を挙げておきます。

エンコードの種類エンコードの指定
日本語 Shift-JISEncoding.GetEncoding(“shift_jis”)
日本語 EUCEncoding.GetEncoding(“euc-jp”)
日本語 JISEncoding.GetEncoding(“iso-2022-jp”)
UnicodeEncoding.Unicode
UTF8Encoding.UTF-8
UTF-32Encoding.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つの文字列として読み込むことができます。

出力結果

月曜日
火曜日
水曜日
木曜日
金曜日

StreamWriterクラスを使用した後はCloseメソッドでストリームを閉じます。この時、Closeメソッドを呼び出すことを忘れてしまうとリソースが解放されません。

StreamWriterでファイルをオープンしたら、Closeメソッドを呼び出してストリームを閉じます。
Closeメソッドを呼び出すことで、関連付けられた全てのリソースが解放されます。

Usingステートメントを使うことで、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行毎に読み込むことができます。

出力結果

月曜日
火曜日
水曜日
木曜日
金曜日

 

プログラミングを更に学びたい方必見

選抜された現役エンジニアから学べるプログラミングスクールで、現場や副業で役に立つノウハウやスキルを習得してみませんか?

オンラインに特化しているので場所に捉われず、自分のライフスタイルに合わせて受講することができます。

副業に興味がある方に人気の「はじめての副業コース」をはじめ、Web開発やシステム開発・アプリ開発などカテゴリ毎に受講ができ、初心者の方でも挫折することなく学ぶことができます。

まずはこの機会に現役のプロに無料相談をしてみましょう。

\ プログラミングスクールの詳細を確認する /

まとめ

この記事ではファイルから文字列を読み込む方法を紹介しました。

System.IOのStreamReaderクラスを利用することで、ファイルからテキストを読み込むことができます。読み込むための2種類のメソッドが用意されていますので、使用用途に応じて使い分けをしましょう。

  1. ReadToEndメソッド:ファイルのテキストを全て読み込む場合に使用する
  2. ReadLineメソッド:1行だけテキストを読み込む場合に使用する

StreamReaderクラスや他のクラスを使えば、ファイルの最後の行だけ読み込みをすることも可能です。気になる方は以下のサイトを参考にしてみてください。

【C#】高速でファイルの末尾を読み取りする方法高速でファイルの最後の行だけ読み込みたいことありませんか?C#でファイルの末尾を取得したいなら、ファイルの後ろから読み取りをすればいいのです。本記事ではその方法を紹介していますので、ぜひ参考にしてみてください。...

以上、最後まで読んで頂きありがとうございました。

プログラミングを学習したいなら…

プログラミングスキルを身に付けるなら、プログラミングを効率良く学べる
プログラミングスクール」がオススメです。

特にこんな方にオススメ!!
これからエンジニアを目指したい
プログラミングの専門性を高めたい
プログラミングを学んで副業をしたい
エンジニアに転職して年収をアップさせたい

プログラミングを触ったことがない未経験からでも、プログラミングスクールで学習すれば、エンジニアへ就職・転職することも可能です。

あなたの「行動力」と「やる気」で、あなたの人生を大きく変えるチャンスになることでしょう。

プログラミングスクールに興味がある方は是非チェックしてみてください。

> プログラミングを学ぶ <

COMMENT

メールアドレスが公開されることはありません。

CAPTCHA